2017-05-28 5 views
1

私はこのスクリプトを使用して自分のディレクトリ内のすべてのフォルダからファイルを取り出し、名前を希望の出力に変更しようとしています。ファイル名の前に

:ファイル名の後に Folder\actors\character\hair\haircurly1.dds

haircurly1.dds

私は、アーカイブから抽出された別の名前で12,000以上のテクスチャで働いています。私の抽出プログラムには、各ファイル名のファイルを展開したフォルダへのパスが含まれていました。たとえば、抽出時にhaircurly1.ddsという名前のファイルの名前はFolder\actors\character\hair\haircurly1.ddsとなりました。

cd ~/Desktop/MainFolder/Folder 

find . -name '*\\*.dds' | awk -F\\ '{ print; print $NF; }' 

このコードは、しかし、私は私ではなく、一度にすべてのファイルを変更することを1にしたい、私はすでに他のコードとのファイルの一部を変更したとして(バックスラッシュを含むで探していますすべてのテクスチャファイルを取得します12000+テクスチャファイル用のすべてのフォルダに固有のコードを書く必要があります)

私はプリントを使用しています。そしてそれは私にファイルパスを送信します。

./Folder\actors\character\hair\haircurly1.dds

私は印刷$NF;を使用し、それは私にawkの区切りの後にテキストを送信します。

\ haircurly1.dds

私はすべてのファイル名を希望しますこのスクリプトはawkコマンドの$ NF出力に変更されます。誰でも私のスクリプトでファイル名を$NF出力に変更する方法を知っていますか?

+0

ファイル名の前後に明確な例を追加できますか? – 123

+0

明快にするために編集しました。 ファイル名の前:Folder \ actors \ character \ hair \ haircurly1.dds ファイル名の後ろ:haircurly1.dds –

+0

そしてそれらはすべてすぐ下のフォルダにありますか? * for \ i *を試してください; echo "$ i" "$ {i ## * \\}";済んだ?ファイル名が正しければ 'echo'を 'mv'に変更してください。 – 123

答えて

-2

は、あなたのawkコマンドの形式を持っており、「MV」コマンド、およびパイプbashに結果を印刷いただき、ありがとうございます。余分な一重引用符は、bashがバックスラッシュを通常のcharとして扱うことを保証します。

find . -name '*\\*.dds' | awk -F\\ '{print "mv '\''" $0 "'\'' " $NF}' | bash -x 

HTH

+0

これはファイル名を変更するのには効果がありましたが、すべてを元のフォルダからカレントディレクトリに移動しました。 –

+0

@DevinWalkerこれはまさにあなたの質問が示唆していることです。名前を 'X/Y/Z/haircut.dds'から' haircut.dds'に変更したいとしています。 。 –

+0

@ MarkSetchell彼らは質問のバックスラッシュです。 – 123

0

あなたの質問は明確ではないですが、やりたいことがあるようですね:

for file in *\\*; do 
    mv -- "$file" "${file##*\\}" 
done 

それはあなたが望むすべてではない場合は、あなたの要件を明確にするためにあなたの質問を編集します。

関連する問題