Bash-Einzeiler-Schleife über Verzeichnisse wirft Fehler

Bash-Einzeiler-Schleife über Verzeichnisse wirft Fehler

Ich versuche, einen Bash-Einzeiler zu erstellen, der die Verzeichnisse im aktuellen Verzeichnis durchläuft und den Inhalt in eindeutige Tar-Dateien packt, wobei der Verzeichnisname als Tar-Dateiname verwendet wird. Die Grundlagen funktionieren (Verzeichnisnamen finden und mit diesen Namen tarnen), aber meine Schleife wirft einige Fehlermeldungen aus und ich kann nicht verstehen, woher sie die Befehle bekommt, die sie ausführen möchte.

Hier ist der Einzeiler, der größtenteils funktioniert:

for f in `ls -d */`; do `tar -czvvf ${f%/}.tar.gz $f`;done

Die „seltsame“ Ausgabe ist:

-bash: drwxrwxr-x: command not found
-bash: drwxr-xr-x: command not found
-bash: drwxr-xr-x: command not found
-bash: drwxrwxr-x: command not found

Welchen Teil des von mir ausgeführten Befehls verstehe ich nicht und welcher erzeugt diese Ausgabe?

Antwort1

Sie müssen die Backtics um Ihren Befehl herum entfernen . Sie können den Befehl tarauch weiterleiten, um sicherzustellen, dass Bash alle Verzeichnisse richtig aufnimmt:lsxargs

for f in `ls -d */ | xargs`; do tar -cvzf ${f%/}.tar.gz $f; done

Die Backticks erfassen die Ausgabe von tarund versuchen, diese in jeder Iteration der Schleife als Befehl auszuführen. Das erste, was tarausgegeben wird, wenn Sie die Option -v verwenden, sind die Berechtigungen für jede Datei (z. B. die drwxrwxr-x). In diesem Fall möchten Sie, dass bashausführender Tar-Befehl erfasst die Ausgabe nicht.

Antwort2

Abonnierenist hinsichtlich der Backticks um richtig tar, Sie müssen jedoch nicht verwenden ls:

for file in */

wird den Zweck erfüllen und Verzeichnisnamen mit Leerzeichen ordnungsgemäß verarbeiten.

Antwort3

Die anderen Antworten hier sind gut, aber ich wollte eine weitere Option hinzufügen für den Fall, dass Sie nur Verzeichnisse und keine symbolischen Links usw. benötigen:

for f in `find -maxdepth 1 -type d` | do -cvzf ${f%/}.tar.gz $f; done 

Hoffe das hilft!

verwandte Informationen