Bash:根据名称移动文件

时间:2014-05-12 16:30:59

标签: linux bash

Heyo家伙

所以我想移动所有包含名称的文件" American"和"爸爸"进入"电视节目中的相应文件夹"夹。我以为我有一个解决方案,但最终它没有成功。由于" *"我得到的论点太多了。在if论证中(至少我认为这是问题)。

我可以以某种方式超越"太多的论点" ?我应该尝试一种完全不同的方法吗?

提前致谢

这是代码的摘录

if [ -d *Game* ] && [ -d *Thrones*]; then
    game=( $(find *Game* -maxdepth 0))
    mv ${game[@]} ../TV\ Shows/Game*/*s04

elif [ -d *American* ] && [ -d *Dad*] ] ; then
    dad=( $(find *American* -maxdepth 0))
    mv ${dad[@]} ../TV\ Shows/American*/*.9

2 个答案:

答案 0 :(得分:1)

确实问题是[ -d *Game* ][ -d "Game_of_Thrones_S04E01.mkv" "Game_of_Thrones_S04E02.mkv" ... ]无效。

如果您要移动与*Game**Thrones*匹配的所有文件,您可以改为:

shopt -s nullglob      # Handle the case of having no matches
# shopt -s nocaseglob  # Uncomment to match case insensitively

for f in *Game* *Thrones*
do
  mv "$f" "../TV Shows/"Game*/*s04
done

for f in *American* *Dad*
do
  mv "$f" "../TV Shows/"American*/*.9
done

答案 1 :(得分:1)

这应该更接近你想要的东西:

find *Game* *Thrones* -maxdepth 0 -exec mv {} ../TV\ Shows/Game\ of\ Thrones/ \;
find *American* *Dad* -maxdepth 0 -exec mv {} ../TV\ Shows/American\ Dad/ \;

我从*命令的目标位置删除了mv,因为这很可能不符合您的预期。 mv命令会将所有指定的名称移动到 last 参数中。