バックスラッシュのあるファイル名をファイルのあるディレクトリ構造に変換するスクリプトを探しています。

バックスラッシュのあるファイル名をファイルのあるディレクトリ構造に変換するスクリプトを探しています。

私たちは現在、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//\\/\/}現在のファイル名を印刷し、\すべて/\\と)に置き換えます。とはすべて特殊文字なので、エスケープする必要があります。ファイルがあるディレクトリを印刷します。たとえば、このファイルを移動したいターゲットディレクトリが返されます。\/\/dirnamedirname /path/to/file/path/to$dir

  • filename=${file##*\\}:ファイル名、\最後のファイルより前のすべての項目を削除してください。これは実際のファイル名です$filename

  • mkdir -p "$dir":ターゲットディレクトリとすべての親ディレクトリを作成します。 makeは親ディレクトリを-p作成し(すでに存在しない限り親ディレクトリなしでは動作しませmkdirん)、すでに存在するディレクトリのエラーを無視します。mkdir foo/barfoo/

  • mv "$file" "$dir"/"$filename":最後のステップは、ファイルを正しい場所に移動することです。

おすすめ記事