2014-05-12 72 views
1

Heyo家伙击:移动文件根据名称

所以我想所有方含名称的文件移到“美国”和“爸爸”到它根据文件夹中的“电视节目”文件夹中。我以为我有这个解决方案,但最终没有成功。由于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 
+0

你的'mv'命令还会遇到你没有明确指定目标目录的问题。 – chepner

回答

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

一个假定OP已经知道“../TV Shows/Game */* s04'会扩展到一个参数。 – chepner

+0

如果它不是第一次,它会在下一个:P –

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命令将把所有指定的名称移动到最后的参数中。

相关问题