bash のディレクトリに対するワンライナー ループでエラーが発生する

bash のディレクトリに対するワンライナー ループでエラーが発生する

私は、現在のディレクトリ内のディレクトリをループし、ディレクトリ名を tar ファイル名として使用して、その内容を一意の tar に tar する bash ワンライナーを作成しようとしています。基本的なことは機能しています (ディレクトリ名を見つけて、その名前で tar にまとめる) が、ループでエラー メッセージが表示され、実行しようとしているコマンドがどこから取得されるのか理解できません。

ほぼ機能するワンライナーは次のとおりです。

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

「奇妙な」出力は次のとおりです。

-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

実行しているコマンドのどの部分が理解できず、その出力が生成されているのでしょうか?

答え1

コマンドの前後のバックティックを削除する必要があります。また、bash がすべてのディレクトリを正しく取得できるようにパイプで渡すことtarもできます。lsxargs

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

バックティックはの出力をキャプチャしtar、ループの各反復でそれをコマンドとして実行しようとします。tar-vオプションを使用すると、最初に各ファイルの権限が表示されます(たとえば、drwxrwxr-x)。この場合、bashは実行するtar コマンドは出力をキャプチャしません。

答え2

ビラウブの周りのバッククォートに関しては正しいですtarが、 を使用する必要はありませんls

for file in */

これで問題は解決し、スペースを含むディレクトリ名も適切に処理されます。

答え3

ここでの他の回答は良いのですが、シンボリック リンクなどではなくディレクトリだけを取得する必要がある場合に備えて、別のオプションを追加したいと思いました。

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

お役に立てれば!

関連情報