2012-03-03 15 views
1

私は関数を持っています。最初の引数は、あるディレクトリへのパスが格納されている文字列です。 この文字列は、の検索結果から出力されます。タイプdパスのリストファイル

私は現在のディレクトリ内のすべてのファイルを一覧表示する場合は、そのシンプル

for file in *; do 
    commands 
done 

しかし、文字列と、それはそれを当然のそのように扱うことはありません。

for file in "$1"; do 
    commands 
done 

は、だから私はLS

for file in `ls "$1"`; do 
    commands 
done` 

を使用することを考えた。しかし、この解決策でそれは単に私がどこにでも使用する勧告を見つけたいくつかの 研究した後、スペースでファイルを扱うことができませんを見つけるが、私は見つからないだろう。 すべてのファイル/ディレクトリ/サブディレクトリを一覧表示するだけで、ツリー全体が表示されますが、現在のディレクトリにはちょっとしたものが必要です。 私はあらゆる助けに非常に感謝します。

pushd "$1" 
for file in *; do 
    echo "$file" 
done 
popd 

しかし、私は、私は

+0

これまで、伝統的にUnixはファイル名のスペースを奨励していなかった理由を知っています。ツールは、パス名にスペース(改行、バックスペース、タブ、およびその他の制御文字)がない場合に最適に動作するよう調整されています。 –

+0

'(cd" $ 1 "|| exit 1; ...)'を使うと、何か問題が起きた場合にメインプロセスがリモートディレクトリに孤立してしまうことがないからです。 –

答えて

3

あなたは唯一の非ドットファイルをしたい場合は、次のようにトリックを行う必要があります。

for file in "$1"/*; do 
    commands 
done 

さらに柔軟なコードは次のとおりです。あなたはそれを管理することができた場合は、これが有効であることができる

while IFS= read -r -d $'\0' result; do 
    commands 
done < <(find -P "$1" -printf %p"\0") 
+1

私はドット以外のファイルは隠しファイルではないと考えていますので、最初の例で説明してください。 – skornos

0
私の作業ディレクトリを変更する必要はありませんいくつかのソリューションを好むだろう:私は動作するようですもう一つを試してみた

UPDATE

あなたが読んだ勧告は、findの-exec機能を使用していたと思います。見つかったファイルごとに実行されるコマンドを渡すことができます。

$ find . -type d -exec stat {} \; 

まず、文字が{}は、ファイルの名前に置き換えられます、そしてあなたはセミコロン\;をエスケープする必要があることに注意してください。

はまた、ここでは、ファイル内のスペースに対処するのに役立ちます別の共通のBashイディオムです:

$ find . -type d | 
while read line; do 
    # commands with $line 
done; 
0

(
cd "$1" || exit 1 
for file in * 
do 
    commands 
done 
) 

括弧はサブシェルの内容を実行します。サブシェルは、ディレクトリを指定されたディレクトリに変更します。シェルのglobbingは、スペースを含むファイル名を含むファイル名を扱います。その主な注意点は、シェルが起動する現在のディレクトリに対する相対的な名前のコマンドを実行している場合、操作がすべて破損することです。私の助言は、 "あなたのPATHにないコマンドを実行しない"です。その場合、問題はありません。

それ以外の場合は、配列にbashの配列とメタキャラクタの展開を確認してください。彼らはタスクを処理することができます。

find ... -print0は、通常xargs -0と組み合わせて使用​​できます。

また考えることができます。

find "$1" -type f -maxdepth 1 -exec command {} + 

これはcommandに適切な引数としてファイル名を提供し、+表記は「便利コマンドラインにフィット限り多くのファイル名」を意味します。これは、xargsがファイルが見つからないときにコマンドを実行せず、標準xargsのデザイン(誤った)機能を誇張している(GNU xargsにはもちろん標準の動作を上書きするオプションがある)というメリットがあります。

+0

あなたの提案に感謝して、サブシェルでコンテンツを実行すると、私が言及したpushd/? また、現在処理されているディレクトリ内のファイル/フォルダに応じて異なる終了コードを返す必要があります。この場合、エクスポートなどを使用する必要がありますか? 現在、私はこのトピックで言及されているすべての可能な方法を考えているので、ここで言及したようにディレクトリを変更するか、Razが投稿した通りに全体のパスと作業をリストするのが最善の解決策かどうか疑問に思っていた。 – skornos

+0

Raz解決策は良いと簡単です。なぜ私はそれを自分で提案していないのか分かりません。あなたが 'cd'をするつもりなら、サブシェルは良い傾向があります。シェルが起動した場所に戻ることができない場合は困惑します(パーミッションはかなり変わっている必要がありますが)。ただし、ステータス処理は複雑です。適切なステータスを持つサブシェルを終了し、それを親シェル( 'estatus = $?')で取得して、それをどうするかを決める必要があります。キャプチャは重要です。コマンドを実行すると '$?'の状態が変わります。 Razの解を使ってください。私はすでにそれをupvoted。 –

1

echo "$str" | while read file ; do echo $file; done

0

権利の答えはすでにありますが、これはボーナスとしてよりです。この問題が発生したときに、ファイル名を印刷してファイルに保存する 'find'で解決しました。その後、ファイルから行ごとにファイル名を抽出しました。また、ファイルからのデータ入力データで多くのシェルコマンドを実行することができます。

関連する問題