2009-11-21 89 views
2
#!/bin/sh 
#My script 

echo "Are you sure you want to reorganize your files?" 
echo "Type y or Y to continue. Anything else will stop the process" 
read response 

if [ "$response" = "y" ] || [ "$response" = "Y" ]; then 
    mkdir video 
    mkdir audio 
    mkdir text 
    mv -v *.txt text >> log.txt 
    mv -v *.wmv video >> log.txt 
    mv -v *.mov video >> log.txt 
    mv -v *.mpg video >> log.txt 
    mv -v *.mp3 audio >> log.txt 
    mv -v *.wma audio >> log.txt 


    echo "Yay, it worked!" 
else 
echo "Nothing happened." 
fi 

我写了上面的脚本将文件组织到子文件夹中。例如,音乐文件将进入音频文件夹。现在我想更进一步,让它更全球化。我想让脚本接受一个命令行参数,它是包含无组织文件的文件夹。这应该允许脚本从文件系统中的任何位置定位并运行,并接受任何无组织文件的文件夹。接受命令的脚本

例子:

organizefiles.sh的MyStuff /媒体//子文件夹将里面去了 “媒体”

文件夹媒体包含了所有的媒体文件。

谢谢!

+0

一个可能的改进:MV -v * {WMV,MOV,MPG}视频>> log.txt中,其中我的脚本的一部分 – 2009-11-21 03:17:02

回答

1

脚本的一部分可以使用这样的第一位置参数:

if [ -d $1 ] 
then 
    mkdir video 
    mkdir audio 
    mkdir text 
    mv -v $1/*.txt text >> log.txt 
    mv -v $1/*.wmv video >> log.txt 
    mv -v $1/*.mov video >> log.txt 
    mv -v $1/*.mpg video >> log.txt 
    mv -v $1/*.mp3 audio >> log.txt 
    mv -v $1/*.wma audio >> log.txt 
else 
    echo "The destination directory does not exist" 
    exit 1 
fi 
+0

当我尝试使用它时,我得到“目的地目录不存在” – 2009-11-21 03:41:11

+0

您是否在“if $ response”行和“echo Yay”行之间放置了该行?你是否将脚本作为'organizfiles.sh mystuff/media'运行? “mystuff/media”是否存在?其实,现在我再看看你的问题,我认为你想从** $ 1移动**,所以我已经相应地编辑了我的答案。 – 2009-11-21 04:13:19

+0

感谢kyou我会马上尝试。 – 2009-11-21 04:19:10

1

脚本必须通过一些变量,像这样的访问参数的命令行:

$1, $2, ..., $n - refers to first, second up to n arguments. 

例如:键入myscript.sh foo将设置FOO到$ 1变量。

+0

我添加这些变量? – 2009-11-21 03:16:34

+0

SOURCE_DIR = $ 1#在文件的顶部,然后检查它是否存在。 – 2009-11-21 03:20:58

+0

这样的:。 #/斌/庆典 源= $ 1 的mkdir电影 MV -v $源/ * WMV电影>> log.txt的 MV -v $源/ * MOV短片>>日志.txt – 2009-11-21 03:23:29

1

Bash参数非常简单,使用$#格式。因此,举例来说,你可以从你的脚本$1

访问命令行的第一个参数在脚本中,你可以做类似这样:

if [ -z $1 ] 
then 
    dir = $1 
else 
    dir = './' 
fi 

然后,只需将新的$dir变量添加到路径在您的mv命令。我建议从IBM检出Bash By Example。一个伟大的文章系列教你Bash。

请注意,可能有一个更好的做我所建议的,但我远不及Bash的专家。 :-)

+0

谢谢你的链接! – 2009-11-21 19:18:04

1

这里有一个简单的系统。你可以使用case/esac而不是if/else来整洁。同时,重新安排了MV的命令有点

#!/bin/bash 
dir=$1 
cd $dir 
while true 
do 
    echo "Are you sure you want to reorganize your files?" 
    printf "Type y or Y to continue. Anything else will stop the process: " 
    read response 
    case "$response" in 
     y|Y) 
      mv -v *.txt text >> log.txt 
      for vid in "*.mov" "*.wmv" "*.mpg" "*.wma" 
      do 
       mv $vid video >> log.txt 
      done 
      echo "yay" 
      break;; 
     *) echo "Invalid choice";; 
    esac 
done 
+0

所以“N”是一个“无效的选择”?你或者需要在你的默认情况下使用“break”,或者你需要一个'n | N'的情况(并且改变你的提示的措辞),除非你不打算回答“否”。你也可以'cd $ 1' - 你不需要$ dir变量。 – 2009-11-21 20:38:26

+0

我不想中断,因为我想再次询问用户的响应。另外,我不是使用这个菜单的人,如果OP想要打破或不打开,OP必须修改以适应他的需要,因此我没有回答完全解决他的问题。我只想命名$ 1到$ dir,有什么问题?它看起来对我来说是英语,也许我想在我的代码中再次使用$ dir,并且我不想与另一个$ 1在我的循环中发生冲突,例如? – ghostdog74 2009-11-21 23:29:14