Listing il contenuto di un file tar o una directory solo fino a un certo livello
Domanda
Mi chiedo come elencare il contenuto di un file tar solo fino a un certo livello?
Capisco tar tvf mytar.tar
elencherà tutti i file, ma a volte mi piacerebbe vedere solo le directory fino a un certo livello.
Allo stesso modo, per il comando ls
, come faccio a controllare il livello di sottodirectory che verrà visualizzato? Per impostazione predefinita, mostrerà solo le sottodirectory diretti, ma non andare oltre.
Soluzione
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
Assicurati di nota, che il numero è 3+ tuttavia molti livelli che si desidera, a causa della / il nome utente / gruppo. Se solo fare
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
è solo due di più.
Si potrebbe probabilmente pipe l'output di ls -R
a questo script awk
, e hanno lo stesso effetto.
Altri suggerimenti
profondità = 1
tar --exclude="*/*" -tf file.tar
profondità = 2
tar --exclude="*/*/*" -tf file.tar
Sarebbe bello se potessimo dire il comando find
di guardare dentro un file tar, ma dubito che sia possibile.
I rapido e brutto (e non infallibile) modo sarebbe quello di limitare il numero di separatori di directory, ad esempio:
$ tar tvf myfile.tar | grep -E '^[^/]*(/[^/]*){1,2}$'
2 dice di visualizzare non più di 2 barre (nel mio caso uno è già stato generato dal separatore utente / gruppo), e quindi, per visualizzare i file in profondità al massimo uno. Si potrebbe desiderare di provare con numeri diversi al posto del 2.
Un'altra opzione è archivemount . Si monta, e cd in esso. Poi si può fare qualsiasi cosa con essa proprio come con altri file system.
$ archivemount /path/to/files.tgz /path/to/mnt/folder
Sembra più veloce del metodo di catrame.
Sono d'accordo con di leonbloy risposta - non c'è modo di fare questo semplicemente all'interno del tarball sé
. Per quanto riguarda la seconda parte della tua domanda, ls
non ha un'opzione di profondità massima. È possibile recurse tutto con ls -R
, ma questo è spesso non è molto utile.
Tuttavia si può fare questo sia con find
e tree
. Ad esempio, per i file e le directory di elenco un livello profondo, si può fare
find -maxdepth 2
o
tree -L 2
tree
ha anche un'opzione -d
, che elenca in modo ricorsivo directory, ma non i file, che trovo molto più utile di -L
, in generale.