72

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

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

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

4

6 に答える 6

172

深さ=1

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


深さ=2

tar --exclude="*/*/*" -tf file.tar
于 2011-11-14T01:33:36.273 に答える
37
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スクリプトにパイプして、同じ効果を得ることができます。

于 2010-04-23T18:24:46.397 に答える
8

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

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

tar方式よりも速いようです。

于 2016-11-21T04:35:42.407 に答える
6

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

私がすばやく醜い(そして絶対確実ではない)方法は、ディレクトリセパレータの数を制限することです。次に例を示します。

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

2は、2つ以下のスラッシュを表示するように指示します(私の場合、1つはユーザー/グループ区切り文字によって既に生成されています)。したがって、最大で1つの深さでファイルを表示します。2の代わりに別の番号を試してみることをお勧めします。

于 2010-04-23T17:27:55.493 に答える
5

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

質問の2番目の部分に関してはls、最大深度オプションはありません。ですべてを繰り返すことができますがls -R、それはあまり役に立たないことがよくあります。

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

find -maxdepth 2

また

tree -L 2

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

于 2010-04-23T17:54:39.423 に答える
1

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}'
于 2021-11-09T18:58:47.927 に答える