Donner une sortie de chat à la rm

0

J'ai des noms de fichiers dans un fichier que je dois supprimer dans un autre répertoire.

Disons que j'ai xet les yfichiers dans dir a. Comment puis-je le supprimer en utilisant chat?

J'ai essayé,

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

a.txta le contenu x,y,z.

Si elles sont dans le même dossier, je peux mettre x y zen a.txtet courir,

rm -f `cat a.txt`

qui fonctionne bien.

J'ai aussi essayé,

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

Cette commande ira dans un fichier docker donc je préfère ne pas utiliser de variables aussi.

Je ne veux pas mettre a/x a/y a/zdans le fichier qui peut être une option, car il est corrigé qui ane contiendra que les fichiers. Mais adevrait être changé que dans le fichier docker. Merci pour toutes les suggestions à l'avance :)

Optimus Prime
la source

Réponses:

1

En supposant que vos noms de fichiers ne contiennent pas d'espaces ni de caractères spéciaux, il vous suffit de réutiliser votre commande d'origine avec le symbole cddevant:

(cd a; rm -f $(cat a.txt))

Soyez averti que les rm -f `cat a.txt`noms de fichiers sont facilement séparés par des espaces ou des caractères spéciaux, vous devez vraiment utiliser des xargsnoms de fichiers délimités par NUL.

muru
la source
Cela fonctionnerait. Bien cdque ne ressemble pas à la meilleure façon de faire. C'est toujours mieux que toutes les autres options. Merci :).
Optimus Prime
2

Vous devriez utiliser la boucle while pour lire le fichier ligne par ligne, puis appliquer chaque ligne à rm. C'est une approche très courante et fréquemment utilisée dans les scripts

while IFS= read -r line
do
       rm a/"$line"
done < file.txt

Naturellement, le format du fichier doit être la liste des fichiers avec un fichier par ligne.

Sergiy Kolodyazhnyy
la source
Oui, cela pourrait fonctionner, mais j'éviterais while. Merci :)
Optimus Prime
@ OptimusPrime de rien. Ça vous dérange si je vous demande pourquoi vous voulez éviter la whileboucle?
Sergiy Kolodyazhnyy
Juste une préférence :) Une commande d'une seule ligne a l'air beaucoup mieux et plus facile à comprendre.
Optimus Prime
1

N'essayez pas de l'utiliser $(cat file)pour ce genre de chose - cela cassera par exemple s'il y a des espaces dans les noms de fichiers, par exemple, donné

$ cat a.txt 
foo
bar baz
bam

et

$ ls -Q a
"bam"  "bar baz"  "foo"  "other file"  "somefile"

ensuite

$ (cd a ; rm $(cat ../a.txt))
rm: cannot remove 'bar': No such file or directory
rm: cannot remove 'baz': No such file or directory

Au lieu de cela, vous pouvez utiliser xargs

$ ls -Q a
"bam"  "bar baz"  "foo"  "other file"  "somefile"
$ xargs -a a.txt -I{} rm a/{}
$ ls -Q a
"other file"  "somefile"

Si vous voulez vraiment utiliser cat, combinez-le avec xargs:

cat a.txt | xargs -I{} rm a/{}

(bien que vu la -afonctionnalité, c'est une utilisation inutile de Cat )


Notez que cela -I{}signifie que -L 1ie rmest appelé une fois pour chaque ligne du fichier d'entrée; si vous n'avez pas besoin de préfixer un chemin de répertoire, vous pouvez alors améliorer l'efficacité de la commande en supprimant les -Icas dans lesquels xargsplusieurs arguments seront passés rm. Cependant, dans ce cas, vous devez explicitement définir le délimiteur d'entrée sur newline, par exemple xargs -a a.txt -d '\n' rmpour éviter les coupures sur les espaces.

Steeldriver
la source