for はファイルの空白を複数行で検出します。

for はファイルの空白を複数行で検出します。

私は今、いくつかの指示に従って、いくつかのファイルをディレクトリAから複数のディレクトリBにコピーするスクリプトを作業しています。スクリプトはうまく機能しますが、スペースがあるファイルの場合は複数のファイルとして扱います。

my_super_cool_file_2007039904_11 (3rd copy).pdf

ファイルがこのループにある間:

for i in $(find $parent -mindepth 1 -maxdepth 1 -type f|cut -c 11-);do
echo "this is the file: $i" 
done

複数のファイルとして扱われます。

  this is the file: my_super_cool_file_2007039904_11
  this is the file: (3rd 
  this is the file: copy).pdf

usingに変更しようとしましたが、space問題が解決していないようです。ループの場合は3つの異なるファイルで、usingと同じ問題があり、引き続き使用する必要がありました。\spacesed 's/ /\\ /g' lsfind

答え1

-maxdepth 1andを使用しているので、-mindepth 1単純なループ(in bash)を実行することもできます。

for name in "$parent"/*; do
    if [ -f "$name" ]; then
        dir=${name%/*}  # dir=$( dirname "$name" )
        dir=${dir##*/}  # dir=$( basename "$dir" )
        printf 'The directory is "%s"\n' "$dir"
    fi
done

屋根の結果はfind通常悪い習慣です。検索結果を繰り返すのはなぜ悪い習慣ですか?

答え2

cut -c 11-ファイルパスのディレクトリ部分を削除するためにGNUを使用しているとしますfind

find "$parent" -mindepth 1 -maxdepth 1 -type f -printf \
  'this is the file: %f\n'

すべてのPOSIXの場合find:

find "$parent/." ! -name . -prune -type f -exec sh -c '
  for file do
    file=${file##*/}
    printf "this is the file: %s\n" "$file"
  done' sh {} +

追加資料:

答え3

$(find $parent -minlength1 -maxlength1 -type f|cut -c 11-) を次のように引用符で囲みます。

 "$(find $parent -mindepth 1 -maxdepth 1 -type f|cut -c 11-)"

関連情報