我有一个包含各种文件类型的文件夹,但我对扩展名为 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.txt
和recurring.txt
,每个文件都包含一个子集列表,P_XXX
我想用它来将子集移动到单独的文件夹(稳定的和再次发生的, 分别)。例如,P_76
和P_201
列于稳定.txt,同时P_104
和P_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