web-dev-qa-db-ja.com

tarファイルまたはディレクトリの内容をあるレベルまでのみリストする

Tarファイルの内容をあるレベルまでしかリストしないのはどうだろう?

わかります tar tvf mytar.tarはすべてのファイルを一覧表示しますが、あるレベルまでのディレクトリのみを表示したい場合があります。

同様に、コマンドlsの場合、表示されるサブディレクトリのレベルをどのように制御しますか?デフォルトでは、直接のサブディレクトリのみが表示されますが、それ以上は表示されません。

51
Tim
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スクリプトにパイプして、同じ効果を得ることができます。

31
Glen Solsberry

深さ= 1

tar --exclude="*/*" -tf file.tar


depth = 2

tar --exclude="*/*/*" -tf file.tar
128
sacapeao

findコマンドにtarファイルの内部を見るように指示できればいいのですが、それが可能かどうかは疑問です。

私は迅速かつい(そして絶対確実ではない)方法は、ディレクトリセパレータの数を制限することです、例えば:

 $ tar tvf myfile.tar | grep -E '^[^/]*(/[^/]*){1,2}$'

2は、2つ以下のスラッシュ(私の場合はユーザー/グループセパレーターによって既に生成されている)を表示し、したがって、最大で1つのファイルを表示するように指示します。 2の代わりに別の番号を試してください。

6
leonbloy

私は leonbloyの答え に同意します-tarball自体の中でこれを直接行う方法はありません。

質問の2番目の部分について、lsには最大深度オプションがありません。 _ls -R_を使ってeverythingを再帰できますが、それはあまり有用ではありません。

ただし、findtreeの両方でこれを行うことができます。たとえば、ファイルとディレクトリを1レベルの深さでリストするには、次のようにします。

_find -maxdepth 2
_

または

_tree -L 2
_

treeには_-d_オプションもあり、これはディレクトリを再帰的にリストしますが、ファイルはリストしません。これは一般的に_-L_よりもはるかに便利です。

5
ire_and_curses

別のオプションは archivemount です。あなたはそれをマウントし、そこにcdします。その後、他のファイルシステムと同じように、それで何でもできます。

$ archivemount /path/to/files.tgz /path/to/mnt/folder

Tarメソッドよりも高速のようです。

5
Sisyphus