如何将所有文件移动(或复制)到具有相同文件名前缀的目录?

如何将所有文件移动(或复制)到具有相同文件名前缀的目录?

使用 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

答案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 globstar使**glob 工作(或使用 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 脚本的解决方法。

=P

相关内容