私の現在の最善策は:
for i in $(find . -name *.jpg); do echo $i; done
問題:ファイル名のスペースを処理しません。
注:「tree」コマンドなど、これをグラフィカルに行う方法も気に入っています。
私の現在の最善策は:
for i in $(find . -name *.jpg); do echo $i; done
問題:ファイル名のスペースを処理しません。
注:「tree」コマンドなど、これをグラフィカルに行う方法も気に入っています。
回答:
正規の方法は
find . -name '*.jpg' -exec echo {} \;
(置き換える\;
と+
に複数のファイルを渡すecho
時)
または(GNU固有ですが、一部のBSDでも同様です)
find . -name '*.jpg' -print0 | xargs -r0 echo
zsh:
for i (**/*.jpg(D)) echo $i
echo
ようなエスケープシーケンスを展開するものを使用しないことは改善されます。\b
echo
find
manページショーfind . -type f -exec file '{}' \;
でEXAMPLES
セクション。たぶん、いくつかのシェルはブレースを特別に扱うでしょう。
'{}'
、\{\}
、{}
、"{}"
、'{'}
「{」および「}」は、2つの文字を見つけるために、1つの引数にシェル(どのボーン状シェル)によって展開されます。「検索」を「エコー検索」に置き換えるかprintf '<%s>\n' find
、再確認する場合。
より良い答えがすでに与えられています。
ただし、指定したコードの問題はスペースだけではないことに注意してください。タブ、改行、ワイルドカード文字も問題です。
と
IFS='
'
set -f
for i in $(find . -name '*.jpg'); do echo "$i"; done
その場合、改行文字のみが問題になります。
あなたが述べたことは、人々がファイル名を読み込もうとするときに直面する基本的な問題の一つです。時々、知識が限られていて、ファイルやフォルダーの構造について誤解している人は、「UNIXではすべてがファイルである」ことを忘れがちです。そのため、ファイル名はスペースを含む2つ以上の単語で構成できるため、スペースを処理する必要があることを理解していません。
解決策:したがって、これを行うためのよく知られた方法の1つは、クリーンな読み取りを行うことです。
ここで、存在するすべてのファイルを読み取り、変数に保持します。次に、必要な処理を行うときは、スペースでファイル名を保持する引用符内にその変数を保持する必要があります。これはそれを行うための基本的な方法の1つですが、ここで他の人から提供された他の答えも同様に機能します。
脚本 :
find /path/to/files/ -iname "*jpg" | \
while read I; do
cp -v --parent "$I" /backup/dir/
done
ここでは、ファイルへのパスと読み取り中のファイルを変数I内に保持することでファイルを読み取ります。これは、後で処理するときに引用して、スペースを正しく処理するように処理します。
これが何らかの形であなたを助けることを願っています。
単純でfind
かつbash
:
find . -name '*.jpg' -exec bash -c '
echo "treating file $1 in bash, from path : ${1%/*}"
' -- {} \;
この$1
ように、基本的なスクリプトのように、bashで使用して、優れたパースペクティブを開き、高度な(またはそうでない)タスクを実行します。
より効率的な方法(すべてのファイルに対して新しいbashを開始することを避けるため):
find . -name '*.jpg' -exec bash -c 'for i do
echo "treating file $i in bash, from path : ${i%/*}"
done' -- {} +
bashの最近のバージョンでは、次のglobstar
オプションを使用できます。
shopt -s globstar
for file in **/*.jpg ; do
echo "$file"
done
単純なアクションの場合、ループを完全にスキップすることもできます。
echo **/*.jpg
set -G
)で動作しますが、bashバージョンはgrep -r
ディレクトリへのシンボリックリンク(find -L
または同等のzsh ***/*.jpg
)。また、findとは反対に、dotfilesは省略され、dotdirsには下がらないことに注意してください(デフォルト)。
$i
か?私はそれをし、それはうまく動作します。そのアプローチに何か問題がありますか?