我有一个文件中的文件名,我需要将其从不同的目录中删除。
假设我在 dir 中有x
和文件。如何使用 cat 删除它?y
a
我试过,
rm -f a/{`cat a.txt`}
a.txt
有内容x,y,z
。
如果它们在同一个文件夹中,我可以输入x y z
并a.txt
运行,
rm -f `cat a.txt`
效果很好。
我也尝试过,
rm -f "a/{"`cat a.txt`"}"
该命令将进入dockerfile,因此我也不想使用任何变量。
我不要想要放入a/x a/y a/z
可以作为选项的文件,因为它是固定的,a
只包含文件。但a
应该只在dockerfile中更改。提前感谢所有建议:)
答案1
您应该使用 while 循环逐行读取文件,然后将每行应用于rm
。这是脚本中非常常见且经常使用的方法
while IFS= read -r line
do
rm a/"$line"
done < file.txt
当然,文件的格式应该是文件列表,每行一个文件
答案2
不要尝试使用$(cat file)
这种东西 - 例如,如果文件名中有空格,它就会中断,例如给出
$ cat a.txt
foo
bar baz
bam
和
$ ls -Q a
"bam" "bar baz" "foo" "other file" "somefile"
然后
$ (cd a ; rm $(cat ../a.txt))
rm: cannot remove 'bar': No such file or directory
rm: cannot remove 'baz': No such file or directory
相反,你可以使用xargs
$ ls -Q a
"bam" "bar baz" "foo" "other file" "somefile"
$ xargs -a a.txt -I{} rm a/{}
$ ls -Q a
"other file" "somefile"
如果你真的想要使用cat
,然后将其与以下相结合xargs
:
cat a.txt | xargs -I{} rm a/{}
(尽管考虑到这个-a
特点,这是一个Cat 的无用用途)
请注意,这-I{}
意味着对输入文件的每一行调用一次-L 1
ie rm
;如果您不需要添加目录路径,那么您可以通过取消 来提高命令效率,-I
在这种情况下xargs
将传递多个参数给rm
。但是在这种情况下,您应该明确将输入分隔符设置为换行符,例如,xargs -a a.txt -d '\n' rm
以防止空格中断。
答案3
假设您的文件名不包含空格或任何特殊字符,只需在原始命令cd
前加上 a 即可:
(cd a; rm -f $(cat a.txt))
请注意,rm -f `cat a.txt`
文件名中的空格或任何特殊字符很容易中断,您应该真正使用xargs
以 NUL 分隔的文件名。