ステップ1

ステップ1

欠落しているファイルに関する質問がmv私の質問に対する答えではないようです。ファイルがある作業ディレクトリで次のコマンドを実行すると、ファイルが失われます。


ステップ1

$layers次のように生成されたファイル名の並べ替えられた配列がありますlayers=$(ls cropped* | sort -nk1.9)

IFS=$'\n';for file in $layers; do echo $file; done  
cropped_1.png  
cropped_2-a.png  
cropped_2-b.png    
cropped_2.png  
cropped_3-a.png  
cropped_3-b.png  
cropped_3.png  
cropped_4-a.png  
cropped_4-b.png  
cropped_4-c.png  
cropped_4-d.png  
cropped_4-e.png  
cropped_4-f.png  
cropped_4-g.png  
cropped_4.png  
cropped_5-a.png  
cropped_5-b.png  
cropped_5.png  
--More--

ステップ2

各ファイル名の _ の後のすべての項目を変更するには、次のループを実行します。

i=1;IFS=$'\n';for file in $layers; do echo ${file/#*_*/cropped_$((i++)).png}; done  
cropped_1.png
cropped_2.png
cropped_3.png
cropped_4.png
cropped_5.png
cropped_6.png
cropped_7.png
cropped_8.png
cropped_9.png
cropped_10.png
cropped_11.png
cropped_12.png
cropped_13.png
cropped_14.png
cropped_15.png
cropped_16.png
cropped_17.png
--More--

ステップ3 - 危険です、ウィル・ロビンソン!

これまではよさそうです。そのため、次のループを使用して各ファイルの名前を変更しようとしましたが、mv結果はmv cropped_2-a.png cropped_2.png次のようになりますmv cropped_2-b.png cropped_3.png

i=1;IFS=$'\n';for file in $layers; do mv $file ${file/#*_*/cropped_$((i++)).png}; done

これにより、最初のファイルにエラーが発生しました。

mv: 'cropped_1.png'と 'cropped_1.png'は同じファイルです。

一致するすべてのファイル名に対してこのエラーが発生すると思いますmv SOURCE DEST。代わりに、ループの最初のファイルでのみエラーが発生します。

奇妙なことに、今では多くのファイルがありません。唯一残ったファイルは次のとおりです。

ls cropped* | sort -nk1.9
cropped_1.png
cropped_141.png
cropped_142.png
cropped_143.png
cropped_144.png
cropped_145.png
cropped_146.png
cropped_147.png
cropped_148.png
cropped_149.png
cropped_150.png
cropped_151.png
cropped_152.png
cropped_153.png
cropped_154.png
cropped_155.png

質問

失われたファイルはどこに移動されましたか?

重複した名前のファイルを作成する前に、140個のファイルがあり、cropped_2-a.png合計155個のファイルがありました。 141-155ファイルが正常に移動された場合、2-140ファイルはどこにありますか?なぜ彼らは意図した目的地に移動しないのですか?現在の作業ディレクトリ?


ノート

名前の付いたファイルを追加しない場合、cropped_2-a.pngループはファイルごとにエラーメッセージを表示し、ファイルは変更されていません。

i=1;IFS=$'\n';for file in $layers; do mv $file ${file/#*_*/cropped_$((i++)).png}; done
mv: ‘cropped_1.png’ and ‘cropped_1.png’ are the same file
mv: ‘cropped_2.png’ and ‘cropped_2.png’ are the same file
mv: ‘cropped_3.png’ and ‘cropped_3.png’ are the same file
mv: ‘cropped_4.png’ and ‘cropped_4.png’ are the same file
mv: ‘cropped_5.png’ and ‘cropped_5.png’ are the same file
--More--

cropped_2a.png(no)-などのファイル名を使用してテストしましたが、ファイルの欠落の問題が重複しています。

mv -v何が起こったのか確認してみると、予想通りファイル名が変わるようでしたが、確認してみるとファイルがなくなりました。パッケージングパラメータの交換1 ${file/#*_*/cropped_$((i++)).png}二重引用符で囲んでもこの問題は解決されません。

i=1;IFS=$'\n';for file in $layers; do mv -v $file "${file/#*_*/cropped_$((i++)).png}"; done
‘cropped_2-a.png’ -> ‘cropped_2.png’
‘cropped_2-b.png’ -> ‘cropped_3.png’
‘cropped_2.png’ -> ‘cropped_4.png’
‘cropped_3-a.png’ -> ‘cropped_5.png’
‘cropped_3-b.png’ -> ‘cropped_6.png’
‘cropped_3.png’ -> ‘cropped_7.png’
‘cropped_4.png’ -> ‘cropped_8.png’
‘cropped_5.png’ -> ‘cropped_9.png’
‘cropped_6.png’ -> ‘cropped_10.png’
--More--

mvより簡単なコマンドをテストするには、パラメータ置換をターゲットパラメータとして使用します。

testy="cropped_2-b.png"
mv -iv $testy ${testy/#*_*/cropped_999.png}

これはまた働きます:

i=998
testy="cropped_2-b.png"
mv -iv $testy ${testy/#*_*/cropped_$((i++)).png}

「cropped_2-b.png」 - >「cropped_998.png」

testy="cropped_3-a.png"
mv -iv $testy ${testy/#*_*/cropped_$((i++)).png}

「cropped_3-a.png」 - >「cropped_999.png」

同じファイルエラー中にforループが失敗する理由や、ファイルが実際にどこに行くのかわかりません。

ベストアンサー1

cropped_2-a.pngに名前が変更されましたcropped_2.png。これは、元のファイルを置き換えてcropped_2.pngから2行後にファイル名を付けますcropped_4.png

この問題を回避する最善の方法は、番号を付け直すときに最初に空の別のディレクトリにファイルを移動することです。これにより、新しい名前が古い名前と競合することを心配する必要はありません。その後、ループが完了すると、名前が変更されたファイルを元のディレクトリに戻すことができます。

おすすめ記事