私たちは現在、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"
:最後のステップは、ファイルを正しい場所に移動することです。
答え2
prename 'mkdir $` while s[\\][/]' *\\*
prename
Perlユーティリティ(時々rename
.このコマンドのデフォルトのオペレーティングモデルは、コマンドラインを介して変更する必要があるファイル名を提供することです。)私たちの場合、名前には1つ以上のバックスラッシュを含むすべての*\\*
ファイル名があります。
これにより、単一引用符内のコードがファイル名に1つずつ適用され、結果$_
が新しいファイル名になります。
while
バックスラッシュを一度に1つずつ徐々にスラッシュに変更し、文字列の事前一致部分である$ ` varが指すディレクトリを作成するループを設定しました。
whileループを終了すると、$_
元のディレクトリの名前が変更されたディレクトリ/サブディレクトリを含むディレクトリ/サブディレクトリ/サブディレクトリ/サブディレクトリ/ファイル名.extが存在します。