
私は、現在のディレクトリ内のディレクトリをループし、ディレクトリ名を 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
もできます。ls
xargs
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
お役に立てれば!