for i in `ls -lrt|grep ^d|cut -d ' ' -f 13-`
do
cd $i
ls
cd ../
done
上記の例では、スクリプトが各ディレクトリに入り、そのディレクトリのすべてのファイルにデータを入力し、そこから出て、他のディレクトリに入り、その内容を出力することを期待しています。ここで間違っていることを提案してください。
フィールド 13 が、ls コマンドの出力の最後のフィールドである目的のフィールドであるかどうかを確認してください。私のシステムでは、それは 9 番目のフィールドです。だから私はあなたのコードを次のように変更しました
for i in `ls -lrt|grep ^d|cut -d ' ' -f9`
do
echo "Directory -$i"
cd $i
ls
cd ../
done
この変更後、正常に動作します。
また、sed、awk などの他のコマンドを使用して実行することもできます。私はawkを使用してそれを行いましたが、フィールド値をハードコーディングしませんでした(ディレクトリの名前であるはずの最後のフィールドを取得するために、内部変数NF - フィールド数を使用しました)。
#for i in `ls -lrt|grep ^d|cut -d ' ' -f9`
for i in `ls -lrt|grep ^d|awk '{print $NF}'`
do
echo "Directory -$i"
cd $i
ls
cd ../
done
これもうまくいきました。
ls フォーマットと可変長テキスト フィールドの気まぐれにより、ls -ltr 出力の各フィールド間に可変数のスペースがあるため、cut コマンドは正しく機能しません。ls ディレクトリ リストからファイル名を解析するより信頼性の高い方法は、cut コマンドを awk '{print $9}' に置き換えることです。したがって、for ループは次のようになります。
for i in `ls -lrt|grep ^d| awk '{print $9}'`
次のいずれかを実行して、探していることを実行しますか?
ls *
ls * -r
現在のディレクトリ内のディレクトリのみを反復処理するには、 pattern を使用します*/
。
for dir in */; do
cd "$dir"
do stuff
cd ..
done
ls
名前にスペースが含まれるファイルでは失敗するため、「 for file in 」のバリエーションを実行しないでください。あなたに必要なのは:
find . -print
現在のディレクトリ内の各ファイルで何かをしたい場合は、
for file in *
do
printf "Working on %s\n" "$file"
<do stuff with "$file">
done
または、すべてのサブディレクトリについても xargs を使用するか、次のようにします。
find . -print |
while IFS= read -r file
do
printf "Working on %s\n" "$file"
<do stuff with "$file">
done
ただし、後者は、パイプベースのソリューションと同様に、名前に改行が含まれるファイルでは失敗します。