根据 .txt 文件中的部分模式将特定文件移动到另一个文件夹

根据 .txt 文件中的部分模式将特定文件移动到另一个文件夹

我有一个包含各种文件类型的文件夹,但我对扩展名为 as 的文件感兴趣.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部分。

我创建了两个 .txt 文件stable.txtrecurring.txt,每个文件都包含一个子集列表,P_XXX我想用它来将子集移动到单独的文件夹(稳定的再次发生的, 分别)。例如,P_76P_201列于稳定.txt,同时P_104P_154列于重复.txt

我尝试从 .txt 文件for loop返回相关内容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"回显时,这两个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

也可以看看:

相关内容