将 cat 输出给 rm

将 cat 输出给 rm

我有一个文件中的文件名,我需要将其从不同的目录中删除。

假设我在 dir 中有x和文件。如何使用 cat 删除它?ya

我试过,

rm -f a/{`cat a.txt`}

a.txt有内容x,y,z

如果它们在同一个文件夹中,我可以输入x y za.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 1ie 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 分隔的文件名。

相关内容