ファイル名プレフィックスが同じディレクトリにすべてのファイルを移動(またはコピー)する方法は?

ファイル名プレフィックスが同じディレクトリにすべてのファイルを移動(またはコピー)する方法は?

バッシュを使う

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

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

<filename_prefix>.<filename_suffix>

私はこれが特定のプロパティを持つすべてのファイルをインポートしてfilename_suffixdistフォルダに入れる簡単な方法であることがわかりました。

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

もう一歩進みます。この場合、filenamefindの出力を使用して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

答え1

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

shopt -s globstarglob操作を実行するためのものです**(またはzshを使用してください!)。echoコマンドが必要なものを印刷したら、後でsを削除します。

答え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スクリプトを呼び出すソリューションです。

=血

関連情報