ls -l出力の各行を繰り返す


119

次の出力の各行を繰り返し処理したいと思います。 ls -l /some/dir/*

今私は試しています: for x in $(ls -l $1); do echo $x; done

ただし、これは行の各要素を個別に反復するため、次のようになります。

-r--r-----
1
ivanevf
eng
1074
Apr
22
13:07
File1

-r--r-----
1
ivanevf
eng
1074
Apr
22
13:17
File2

しかし、私は各行全体を繰り返し処理したいと思います。それ、どうやったら出来るの?


1
特別な理由がない限り、常に変数(およびコマンド出力)を引用してください。
グレン・ジャックマン、

回答:


246

次のように、IFSを改行に設定します。

IFS='
'
for x in `ls -l $1`; do echo $x; done

IFSを永続的に設定したくない場合は、その周りにサブシェルを配置します。

(IFS='
'
for x in `ls -l $1`; do echo $x; done)

またはながら使用| 代わりに読んでください:

ls -l $1 | while read x; do echo $x; done

while / readを同じシェルレベルで実行するもう1つのオプション:

while read x; do echo $x; done << EOF
$(ls -l $1)
EOF

12
whileにパイプするときは注意してください、whileはサブシェルで実行されます。つまり、メインプロセスの変数を変更できませんでした
Reorx

1
ここで$ 1は何をしていますか?これは、引数を受け入れるスクリプトを作成しているときに使用する必要があります。$ 1は物事を捨てています。同じ効果を得るために、$ 1の代わりに何を置くことができますか?2番目のソリューションを使用します。
noob-in-need

@ noob-in-needリストに
含め

1
あなたがしたいかもしれませんread -rか、そうでなければbashはエスケープされていないバックスラッシュをデータから取り除きます。
ブライアンゴードン

6

各行で何をしたいかによります。awkは、このタイプの処理に役立つユーティリティです。例:

 ls -l | awk '{print $9, $5}'

..私のシステムでは、ディレクトリ内の各アイテムの名前とサイズを出力します。


3

すでに述べたように、awkはこれに適したツールです。awkを使用したくない場合は、「ls -l」の出力を1行ずつ解析する代わりに、すべてのファイルを反復処理して、次のように個々のファイルごとに「ls -l」を実行できます。

for x in * ; do echo `ls -ld $x` ; done

3

findコマンドを試すこともできます。現在のディレクトリ内のファイルのみが必要な場合:

find . -d 1 -prune -ls

それぞれにコマンドを実行しますか?

find . -d 1 -prune -exec echo {} \;

行を数えますが、ファイル内だけですか?

find . -d 1 -prune -type f -exec wc -l {} \;


見つけられない。多くの場合、奇妙なエラーメッセージが表示されます。コマンドラインが完全に有効な場合に助けを求めます。これを実行すると、次の再起動までは停止しないようです。エラーに関しては、実際にはランダムに見えることがあります。どうすればバグを報告できるかわかりません。
ジムマイケルズ


-1

だから、なぜ彼が処理したくない部分を排除するオプションを使うことを誰も提案しなかったのですか?

最新のDebianでは、次のようにファイルを取得するだけです。

ls --format=single-column 

さらに、完全なディレクトリを使用する場合は、それを実行しているディレクトリに注意を払う必要はありません。

ls --format=single-column /root/dir/starting/point/to/target/dir/

この最後のコマンドで上記を使用しており、次の出力が得られます。

bot@dev:~/downloaded/Daily# ls --format=single-column /home/bot/downloaded/Daily/*.gz
/home/bot/downloaded/Daily/Liq_DailyManifest_V3_US_20141119_IENT1.txt.gz
/home/bot/downloaded/Daily/Liq_DailyManifest_V3_US_20141120_IENT1.txt.gz
/home/bot/downloaded/Daily/Liq_DailyManifest_V3_US_20141121_IENT1.txt.gz
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.