Wie kann ich verhindern, dass den Argumenten von „xargs“ Leerzeichen vorangestellt werden?

Wie kann ich verhindern, dass den Argumenten von „xargs“ Leerzeichen vorangestellt werden?

Ich habe ein Archiv, dessen Inhalt nicht in einem Unterverzeichnis gespeichert ist, in ein Verzeichnis extrahiert, das mit anderen Dateien gefüllt ist und nun unübersichtlich und verwirrend ist.

Um dies zu beheben, habe ich das Archiv in ein neues leeres Verzeichnis extrahiert und möchte die dortige Verzeichnisliste verwenden, um die Dateien aus dem ersten Verzeichnis zu löschen, die durcheinander geraten sind. Die Dateien wurden ursprünglich in das Verzeichnis „/usr/src/packages“ extrahiert und das neue Verzeichnis ist ~/Programs/DBeaver.

vfclists@hp01:~/Programs/DBeaver$ ls -l
total 216
-rw-r--r--  1 vfclists vfclists 48943 Oct 23 23:28 artifacts.xml
drwxr-xr-x  4 vfclists vfclists  4096 Oct 23 23:28 configuration
-rwxr-xr-x  1 vfclists vfclists 79058 Oct 23 22:58 dbeaver
-rw-r--r--  1 vfclists vfclists   206 Oct 23 23:28 dbeaver.ini
-rw-r--r--  1 vfclists vfclists  7919 Oct  9 14:05 dbeaver.png
drwxr-xr-x 23 vfclists vfclists  4096 Oct 23 23:28 features
-rwxr-xr-x  1 vfclists vfclists 35021 Oct 23 22:58 icon.xpm
drwxr-xr-x  2 vfclists vfclists  4096 Oct 23 23:28 licenses
drwxr-xr-x  4 vfclists vfclists  4096 Oct 23 23:28 p2
drwxr-xr-x  6 vfclists vfclists 20480 Oct 23 23:28 plugins
-rw-r--r--  1 vfclists vfclists  1791 Oct 23 23:28 readme.txt
vfclists@hp01:~/Programs/DBeaver$ 

Ich möchte also die Ausgabe an lsxargs weiterleiten, aber wenn ich den Befehl ausführe, wird dem Dateinamen ein Leerzeichen vorangestellt, sodass ich eine Testausgabe wie diese erhalte.

vfclists@hp01:~/Programs/DBeaver$ ls  | xargs -n 1 echo rm /usr/src/packages/
rm /usr/src/packages/ artifacts.xml
rm /usr/src/packages/ configuration
rm /usr/src/packages/ dbeaver
rm /usr/src/packages/ dbeaver.ini
rm /usr/src/packages/ dbeaver.png
rm /usr/src/packages/ features
rm /usr/src/packages/ icon.xpm
rm /usr/src/packages/ licenses
rm /usr/src/packages/ p2
rm /usr/src/packages/ plugins
rm /usr/src/packages/ readme.txt

Außerdem muss zwischen Verzeichnissen und Dateien unterschieden werden, aber darauf möchte ich zuerst eingehen.

UPDATE: Es stellt sich heraus, dass das rm -rfsowohl auf Dateien als auch auf Verzeichnissen funktioniert, also spielt es in diesem Fall keine Rolle, also muss ich einfach ersetzen rm xxxxdurchrm -rf xxxx

Antwort1

Verwenden Sie -I {}und {}an der Stelle, an der das Argument erscheinen soll:

xargs -I {} -n 1 echo rm /usr/src/packages/{}

(Sie können etwas anderes als verwenden {}, {}ist nur sehr gebräuchlich.)

Ohne dies xargsfügt es die Eingabe einfach als zusätzliche Argumente hinzu. Es geht also nicht darum, irgendwo Leerzeichen einzufügen – der Befehl erhält die Eingabe als separate Argumente.

Sie sollten wahrscheinlich findanstelle von verwenden ls, insbesondere wenn Sie zwischen Dateien und Verzeichnissen unterscheiden möchten.

So etwas, um nur Dateien zu löschen:

find . -type f -exec rm /usr/src/packages/{} \;

verwandte Informationen