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


9

使用重击

假设我有一堆文件随机放置在父目录中~/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

Answers:


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

使用shopt -s globstar使**水珠工作(或使用zsh的!)。echo如果命令显示所需内容,请稍后删除。


使用bash是一样的吗?
qodeninja 2012年

@codeninja shopt -s globstar,请参阅我的编辑。如果只有两个级别,则可以使用,*/*.*并且该片段将在任何Shell中运行。
吉尔(Gilles)'所以

2

作弊查找命令行:

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

实际上是在查找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 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.