lsはディレクトリ内の特定の名前のファイルを探しますが、findはそうではありません。

lsはディレクトリ内の特定の名前のファイルを探しますが、findはそうではありません。

で始まる名前を見つけようとします80s

ls 80s*/*正しいファイルが見つかりましたが、find . -ipath '80s*/*'何も返されません。findこのタスクの正しいコマンドは何ですか?

findこれらのファイルをすべて別のフォルダに移動して解析したくないので、使用する必要がありますls

答え1

-ipath現在のパスを含むフルパス名と一致します.。したがって、パターンには次のものを含める必要があります。

find . -ipath './80s*/*'

上記の内容もディレクトリを出力します。一般ファイルのみをリストするには、次のようにします。

find . -ipath './80s*' -type f

(または! -type dディレクトリを除くすべての種類のファイルについて)

答え2

あなたが言ったように80s*/*正しいファイルが一致すると、そのファイルを使う理由はまったくありませんfind

80s*/*一致するすべての名前をいくつかのターゲットディレクトリに移動するには、destdir次のものを使用できます。

mv -n 80s*/* destdir/

これにより、一致するディレクトリの隠されていないすべての名前が80s*単一のディレクトリに移動されますdestdir。非標準-nオプションとは通常、「破壊なし」を意味します。つまり、名前の競合があってもファイルを上書きしません。

mvGNUを使用している場合は、上記のようにオプション()または()を使用して、他のファイルと同じ名前のファイルを上書きするのを防ぐこともできます。--backup--backup=numbered-n--no-clobber

必ず選ばなければならないなら定期的なファイルを削除する80s*/*か、長すぎる名前のリストに展開する場合は、ループを使用してください。

for name in 80s*/*; do
    [ ! -f "$name" ] && continue
    mv -n "$name" destdir/
done

(これにより、シンボリックリンクも通常のファイルに移動されます。このような状況を回避するには、シンボリックリンクの場合は-h/ testを追加してください。)-L"$name"

zshシェルでは、以下を使用してパターンに一致するすべての一般ファイルを移動できます。

mv -n 80s*/*(.) destdir/

...ここで、glob修飾子は、前のパターン(.)の結果をフィルタリングして通常のファイルのみを含むようにします((-.)一般ファイルへのシンボリックリンクも含めて)。


ぜひ使用する必要がある場合は、findもう一度考えてください。

find ./80s*/ -path './80s*/*' -prune ! -name '.*' -type f \
    -exec mv -n {} destdir/ \;

これは興味のある名前と一致し、名前を隠すことを防ぎます(一致が80s*/*正しいと言うと、名前を隠す必要がないという意味であると仮定します)。それプラム一致するすべての名前、つまりパターンに一致するサブディレクトリを入力せずに名前が通常のファイルに対応する場合は、以前と同じように使用するdestdirファイルを移動します。mv -n

mvGNUを使用すると、元の 。これにより、各名前に対して一度呼び出すのではなく、見つかったファイル名を一括して実行します。-exec mv -n -t destdir/ {} +-execmvmv

関連情報