どのようにすれば、すべてのファイルを同じファイル名プレフィックスを持つディレクトリに移動(またはコピー)できますか?


9

Bashの使用

たとえば、親ディレクトリにランダムに配置された一連のファイルがあるとします。~/src特定のサフィックスに一致するすべてのファイルを取得し、それらを~/distディレクトリに移動(またはコピー)したいとします。

この目的のために、すべてのファイル名に次の命名規則があると仮定します。

<filename_prefix>.<filename_suffix>

これが特定のファイルをすべて取得filename_suffixしてdistフォルダーに配置する簡単な方法であることがわかりました。

mkdir ~/dst
find source -name "*.xxx" -exec mv -i {} -t ~/dst \;

ここでさらに一歩...この場合filename、findの出力を使用して、を使用しfilename_prefixて同じ名前のディレクトリを生成し、~/distそのプレフィックスを持つすべてのファイルを適切なディレクトリに移動(またはコピー)する方法を教えてください。

mkdir ~/dst
find source -name "*.xrt,*.ini,*.moo" -exec mv -i {} -t ~/dst \;

基本的に、上記のコマンドを変更(または別のコマンドを使用)して、次のような構造を作成するにはどうすればよいですか。

(出力)

~/dist/people/people.xrt
~/dist/games/games.xrt
~/dist/games/games.moo
~/dist/games/games.ini
~/dist/monkeys/monkeys.ini
~/dist/monkeys/monkeys.xrt

このようなディレクトリツリーから?

(入力)

~/src/xrt/people.xrt
~/src/xrt/games.xrt
~/src/conf/games.ini
~/src/pack/monkeys.xrt
~/src/e344/games.moo
~/src/e344/monkeys.moo
~/src/en-us/monkeys.ini

回答:


10

findこの場合何をすべきかを言うのは地獄でしょう。

シェルをよりよく使う:

for i in **/*.{xrt,ini,moo}; do
  FILE=$(basename "$i")
  DIR=~/dst/${FILE%.*}
  echo mkdir -p -- "$DIR"
  echo mv -i -t "$DIR" -- "$i"
done

globを機能shopt -s globstarさせるために使用します**(またはzsh!を使用します)。またecho、コマンドが必要なものを出力する場合は、後でsを削除します。


bashを使用してこれは同じですか?
qodeninja

@codeninja shopt -s globstar、私の編集を参照してください。レベルが2つしかない場合は、使用でき*/*.*、スニペットはどのシェルでも機能します。
Gilles 'SO-悪をやめる'

2

コマンドラインの浮気:

find source -name "*.xrt,*.ini,*.moo" -exec env file={} bash -c 'base="$(basename "$file")";dir="dst/${base%.*}";mkdir -p "$dir";cp "$file" "$dir"' \;

実際には、find LOLでbashスクリプトを呼び出すための回避策です。

= P


1
呼び出されるファイルがあるとどうなるかを推測してください… happy rm -rf /!この種のコードは-1に値します。
ステファン・ヒメネス

あなたの編集は十分ではありません:聞かせてあなたは、リンク上でcliked、ダウンロード言いYay" rm -rf / "Rox0r.avi、再び...問題のようにあり
ステファン・ヒメネス

(そして、この種の置換を安全にする方法はありません)。
ステファン・ヒメネス

1
おそらく、これを別の方法で行うことは可能です。次のように機能するようです-exec bash -c 'command which uses "$1"' bash '{}' ';'。まあ、とにかくそれは全く無意味です。
ステファン・ヒメネス

1
@StéphaneGimenezが完了しました。使用するのはbashだけではありません。笑
yuyichao
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.