.txt ファイルの部分パターンに基づいて、特定のファイルを別のフォルダに移動します。

.txt ファイルの部分パターンに基づいて、特定のファイルを別のフォルダに移動します。

さまざまなファイル形式のフォルダがありますが、.img次のパターンを使用して拡張子を 。インファイルに興味があります。

ppi_noTD_d0_P_76con_0001.img
ppi_noTD_d0_P_104con_0001.img
ppi_noTD_d0_P_150con_0001.img
ppi_noTD_d0_P_201con_0001.img
etc. 

変更されるファイル名の唯一の部分はP_XXX部分です。

2つの.txtファイルを作成しました。各ファイルstable.txtには、サブセットを別のフォルダに移動するために使用するサブセットのrecurring.txtリストが含まれています(P_XXX安定そしてまたそんなことが起こった、それぞれ)。たとえば、P_76およびP_201は次のとおりです。安定.txt、同時に、P_104リストP_154に表示されます。繰り返し.txt

for loop.txtファイルから関連コンテンツを返し、P_XXXフォルダ内の.img他のファイルfor loopから一致を検索し、次の場所に移動しようとします。安定フォルダ:

for P in $(< stable.txt); do
     for f in *"$P"*.img; do
         echo mv - "$f" "./stable/$f"
     done
done 

リストされた正しい数値を返しますP_XXXが、$f完全なファイル名は返しません(ビットのみを返します*P_XXX)。奇妙なことに、P_XXX最後の.txtファイルの完全なファイル名を返します。ppi_noTD_d0_P_201_con_0001.img

通話に問題があるようで、$fファイルをそのフォルダに移動できません(安定そしてまたそんなことが起こった)。

この問題をどのように解決できますか?


編集する:

これは私が得た結果です。

*.img ./stable/*P_76
*.img ./stable/*P_86
*.img ./stable/*P_89
*.img ./stable/*P_90
*.img ./stable/*P_91
*.img ./stable/*P_99
*.img ./stable/*P_121
*.img ./stable/*P_128
*.img ./stable/*P_132
*.img ./stable/*P_136
*.img ./stable/*P_140
*.img ./stable/*P_144
*.img ./stable/*P_153
*.img ./stable/*P_156
*.img ./stable/*P_162
*.img ./stable/*P_180
*.img ./stable/*P_203
*.img ./stable/*P_205
*.img ./stable/*P_208
*.img ./stable/*P_211
*.img ./stable/*P_215
*.img ./stable/*P_229
*.img ./stable/*P_250
*.img ./stable/*P_256
mv - ppi_noTD_d0_P_257con_0001.img ./stable/ppi_noTD_d0_P_257con_0001.img

答え1

ファイルstable.txtがWindowsシステムで作成または編集されている可能性があります。新しいチームキャリッジリターン+改行シーケンスとして表示されます(しばしばCR LF略語またはエスケープシーケンスを使用して引用\r\n)。

たとえば、次のサンプルファイルを考えてみましょう。

printf '%s\r\n' P_76 P_201 >stable.txt

スクリプトが最初の行を読み取った後、ワイルドカード式は、ファイル名に*"$P"*.img実際にキャリッジリターンが含まれていない限り何も一致しません。有効nullglobなオプションがないか、それに対応するオプションがない場合、f値は*P_76\r*.imgエコーされると、mv - "$f" "./stable/$f"これら2つのCR文字が後続のテキストを行の先頭に挿入し、既存のテキストを上書きします。

以下を使用して、ファイルのCR LF改行順序を確認できます。

$ cat -v stable.txt
P_76^M
P_201^M

または

$ od -An -c stable.txt
   P   _   7   6  \r  \n   P   _   2   0   1  \r  \n

または

$ file stable.txt
stable.txt: ASCII text, with CRLF line terminators

次の方法を使用して、Unix、LF 終了形式に変換できます。

$ dos2unix stable.txt

また見なさい:

関連情報