で始まる名前を見つけようとします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
オプションとは通常、「破壊なし」を意味します。つまり、名前の競合があってもファイルを上書きしません。
mv
GNUを使用している場合は、上記のようにオプション()または()を使用して、他のファイルと同じ名前のファイルを上書きするのを防ぐこともできます。--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
mv
GNUを使用すると、元の 。これにより、各名前に対して一度呼び出すのではなく、見つかったファイル名を一括して実行します。-exec mv -n -t destdir/ {} +
-exec
mv
mv