* .tar.gz、1行に1つのファイル名をリストする方法は?


8

.tar.gz次のコマンドのみを使用して、すべてのファイルを一覧表示しようとしています。

ls *.tar.gz -l

...次のリストが表示されます。

-rw-rw-r-- 1 osm osm  949 Nov 27 16:17 file1.tar.gz
-rw-rw-r-- 1 osm osm  949 Nov 27 16:17 file2.tar.gz

ただし、次のようにリストする必要があります。

file1.tar.gz 
file2.tar.gz

そしてまた:

file1.tar.gz file2.tar.gz

これはどのように「適切に」行われますか?


6
ファイル名の前にオプションを使用するのは良い習慣です。-lの代わりに-1を使用する必要があります
AnonymousLurker

17
ls -1 *.tar.gzが、リスト何に使用ますか?それらのファイル名に対して何かをしている場合、それlsを行う正しい方法ではありません。なぜ `ls`を解析しない*(そして代わりに何をするのか)を
クサラナンダ

3
必要なマニュアルはman lsです。表示フォントの1(1)とl(小文字のエル)のコントラストが適切であることを確認してください。
ctrl-alt-delor 2018年

回答:


39

-1オプション(数字「1」ではなく、小文字の「L」)はなし他の情報と1行につき1つのファイルが一覧表示されます:

ls -1 -- *.tar.gz

1
なぜダブルダッシュなのか?ls -1 *.tar.gz同様に動作します。
RonJohn 2018年

8
@RonJohnは、で始まるファイル名の予期しない事態を回避します-
Stephen Kitt

5
具体的に言う...私は、攻撃者があって、次のファイルを持っていました:.hiddenfilebenign.phpevil.bin--hide=*evil*、なし--あなたは表示されませんevil.bin --hide=*evil*
wizzwizz4

ない-2(または-3など)とはまったくがっかりです。;-)
ピーター-モニカを

1
(... columns
それで

19

ファイル名だけが必要な場合は、次を使用できますprintf

printf '%s\n' *.tar.gz

...シェルは*.tar.gzワイルドカードをファイル名に展開し、printfそれらを出力し、それぞれに改行を続けます。この出力からのビットを異なるであろうls、それらに埋め込まれた改行を含むファイル名の場合:

セットアップ

$ touch file{1,2}.tar.gz
$ touch file$'\n'3.tar.gz

ls

$ ls -1 -- *.tar.gz
file1.tar.gz
file2.tar.gz
file?3.tar.gz

printf

$ printf '%s\n' *.tar.gz
file1.tar.gz
file2.tar.gz
file
3.tar.gz

6
参照してls -bls -QLS、 --quoting-style=...
Stephen Kitt

そしてprintf '%q\n'。(両方のGNU。)
dave_thompson_085 '29

9

ls出力がパイプされるときの動作は異なります。例えば:

ls          # outputs filenames in columns
ls | cat    # passes one filename per line to the cat command

したがって、すべての*.tar.gzファイルを1行に1つずつ表示するには、次のようにします。

ls *.tar.gz | cat

しかし、出力をパイプ処理したくない場合はどうでしょか。つまりls、出力をパイプ処理せずにファイル名を強制的に行に出力する方法はありますか?

はい、-1スイッチ付きです。(これは1のダッシュです。)したがって、次のコマンドを使用できます。

ls -1             # shows all (non-hidden) files, one per line
ls -1 *.tar.gz    # shows only *.tar.gz files, one per line

7

またはGNU find

find  -name "*.tar.gz"  -printf '%P\n'

反し中ls*、それが検索されます.tar.gz再帰的にファイル:

$ find  -name "*.tar.gz"  -printf '%P\n'
file1.tar.gz
dir/file3.tar.gz
file2.tar.gz

なぜかと-printf '%P\n'いう-printと、Posixと互換性のあるすべてのものfindが機能します。
Martin Bonnerがモニカをサポートする

@MartinBonner -print./、ファイル名の前に追加されるためです。
Arkadiusz Drabczyk

4

少し回り道があり、ルーピーな方法:

for i in *.tar.gz; do
    echo "$i"
done

編集:奇妙なファイル名を処理するための引用符を追加しました


5
touch -- '-e \a.tar.gz'変数を引用する理由と、unix.stackexchange.com / q / 65803/117549(エコーの代わりにprintfを使用する理由)
Jeff Schaller

結果、-e \a.tar.gzファイルを削除する方法を理解するために5分間費やしました
2018年

3
ごめんなさい!rm -- '-e \a.tar.gz'トリックを行う必要があります
ジェフシャラー

あなたは上手です、それはレッスンでした、そして私はそれが他の多くのために--働くことを学びrmました。
18年

@JeffSchaller:ローカル名の他の解決策はrm_etc './-x blah'
dave_thompson_085 '29
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.