私たちは現在、Windowsで実行されていた新しいアプリケーションをLinuxでテストしています。プログラムにはいくつかのハードコーディングされたパスがあるように見え、バックスラッシュを含む長いファイル名を持つテストファイルの束が生成されます。たとえば、
directory\subdirectory\subdirectory\subdirectory\filename.ext
このファイルをインポートしてディレクトリを作成し、そこに移動する必要があります。たとえば、上記のファイルは実際には次のようになります。
directory/subdirectory/subdirectory/subdirectory/filename.ext
どうすればいいですか?
ベストアンサー1
名前を変更する必要がある場合みんな名前に含まれるファイルの場合は、\
次のことができます。
for file in *\\*; do
dir="$(dirname -- "${file//\\/\/}")"
filename="${file##*\\}"
mkdir -p -- "$dir"
mv -- "$file" "$dir"/"$filename"
done
説明する
for file in *\\*
:globは、*\\*
を含む現在のディレクトリの名前と一致します\
。\
この文字もエスケープ文字なので、リテラルとして扱うようにエスケープする必要があります。だから私たちは*\*
。次に、名前に含まれるすべてのファイルとディレクトリを繰り返し、
\
それぞれを$file
。dir="$(dirname "${file//\\/\/}")"
:${file//\\/\/}
現在のファイル名を印刷し、\
すべて/
。\\
と)に置き換えます。とはすべて特殊文字なので、エスケープする必要があります。ファイルがあるディレクトリを印刷します。たとえば、このファイルを移動したいターゲットディレクトリが返されます。\/
\
/
dirname
dirname /path/to/file
/path/to
$dir
filename=${file##*\\}
:ファイル名、\
最後のファイルより前のすべての項目を削除してください。これは実際のファイル名です$filename
。mkdir -p "$dir"
:ターゲットディレクトリとすべての親ディレクトリを作成します。 makeは親ディレクトリを-p
作成し(すでに存在しない限り親ディレクトリなしでは動作しませmkdir
ん)、すでに存在するディレクトリのエラーを無視します。mkdir foo/bar
foo/
mv "$file" "$dir"/"$filename"
:最後のステップは、ファイルを正しい場所に移動することです。