tarファイルの内容をあるレベルまでしかリストできないのだろうか?
すべてのファイルが一覧表示されることは理解tar tvf mytar.tar
していますが、あるレベルまでのディレクトリのみを表示したい場合があります。
同様に、コマンドのls
場合、表示されるサブディレクトリのレベルを制御するにはどうすればよいですか?デフォルトでは、直接のサブディレクトリのみが表示され、それ以上は表示されません。
深さ=1
tar --exclude="*/*" -tf file.tar
深さ=2
tar --exclude="*/*/*" -tf file.tar
tar tvf scripts.tar | awk -F/ '{if (NF<4) print }'
drwx------ glens/glens 0 2010-03-17 10:44 scripts/
-rwxr--r-- glens/www-data 1051 2009-07-27 10:42 scripts/my2cnf.pl
-rwxr--r-- glens/www-data 359 2009-08-14 00:01 scripts/pastebin.sh
-rwxr--r-- glens/www-data 566 2009-07-27 10:42 scripts/critic.pl
-rwxr-xr-x glens/glens 981 2009-12-16 09:39 scripts/wiki_sys.pl
-rwxr-xr-x glens/glens 3072 2009-07-28 10:25 scripts/blacklist_update.pl
-rwxr--r-- glens/www-data 18418 2009-07-27 10:42 scripts/sysinfo.pl
ユーザー名/グループに/が含まれているため、必要なレベルの数は3+であることに注意してください。あなたがするだけなら
tar tf scripts.tar | awk -F/ '{if (NF<3) print }'
scripts/
scripts/my2cnf.pl
scripts/pastebin.sh
scripts/critic.pl
scripts/wiki_sys.pl
scripts/blacklist_update.pl
scripts/sysinfo.pl
あと2つだけです。
おそらく、の出力ls -R
をこのawk
スクリプトにパイプして、同じ効果を得ることができます。
もう1つのオプションはarchivemountです。あなたはそれをマウントし、それにcdします。そうすれば、他のファイルシステムと同じように、それを使って何でもできます。
$ archivemount /path/to/files.tgz /path/to/mnt/folder
tar方式よりも速いようです。
コマンドにtarファイルの内部を調べるように指示できればいいのですが、それが可能かどうかはfind
疑問です。
私がすばやく醜い(そして絶対確実ではない)方法は、ディレクトリセパレータの数を制限することです。次に例を示します。
$ tar tvf myfile.tar | grep -E '^[^/]*(/[^/]*){1,2}$'
2は、2つ以下のスラッシュを表示するように指示します(私の場合、1つはユーザー/グループ区切り文字によって既に生成されています)。したがって、最大で1つの深さでファイルを表示します。2の代わりに別の番号を試してみることをお勧めします。
私はleonbloyの答えに同意します-tarball自体の中でこれを簡単に行う方法はありません。
質問の2番目の部分に関してはls
、最大深度オプションはありません。ですべてを繰り返すことができますがls -R
、それはあまり役に立たないことがよくあります。
find
ただし、との両方でこれを行うことができますtree
。たとえば、ファイルとディレクトリを1レベル深くリストするには、次のようにします。
find -maxdepth 2
また
tree -L 2
tree
また、ディレクトリを再帰的にリストするオプションもありますが、ファイルはリストしません。これは、一般的に、-d
よりもはるかに便利です。-L
grepを使用して、特定の深さのディレクトリ名のみを表示できました。
深さについて3
:
tar -tf mytar.tar | grep -Ex '([^/]+/){3}'
または深さの場合$DEPTH
:
tar -tf mytar.tar | grep -Ex '([^/]+){$DEPTH}/'
@sacapeaoの承認された回答grep
と組み合わせることで、それをスピードアップできます。--exclude
深さ3の場合:
tar --exclude '*/*/*/*/*' -tf mytar.tar | grep -Ex '([^/]+/){3}'