我可以很容易地在终端中移动文件。我每天都有学生提交的一大堆东西,如果能在晚上运行一个程序,将所有照片提交(通常是 JPG 和 PNG)移动到一个目录,将所有文本内容移动到另一个目录,我的生活就会轻松很多。
我可以使用一些基本的mv *.jpg
命令来编写一些内容,但如果那里没有任何这类文件,那么我认为整个脚本都会失败,整个节省时间的练习都将毫无意义。
更复杂的是,我的几个高年级学生提交了 zip 文件,所以我希望能够先让脚本将它们提取出来。
因此,TL;DR - 提取 zip 并移动文件,而不会因为没有特定类型的文件而导致错误而停止。
答案1
我认为整个脚本都会失败
不会,只有单个命令会“失败”(这意味着*.jpg
通配符模式将扩展为文字*.jpg
,如果文件*.jpg
不存在,这将导致命令抛出错误),但脚本将继续执行,尽管出现错误。因此在大多数情况下这不是问题,但是如果您想以正确的方式做事™,请failglob
在运行包含通配符模式的命令之前启用:
shopt -s failglob
如果
failglob
设置了 shell 选项,并且没有找到匹配项,则会打印错误消息并且不会执行该命令。
将当前工作目录中的所有 .zip 文件提取到单个目录:
unzip '*.zip' -d /path/to/target/directory
请注意,它*.zip
被括在单引号中,这样就unzip
可以自行扩展模式(否则命令将失败)。
把所有内容放在一起:
#/bin/bash
shopt -s failglob
mv *.jpg /path/to/target/directory
mv *.png /path/to/target/directory
unzip '*.zip' -d /path/to/target/directory
答案2
有 3 个使用find SOURCE_FOLDER -type f -exec COMMAND {} \;
结构的命令就足够了。下面是一个结合了所有 3 个命令的脚本。如果没有找到文件,每个命令都会静默退出 - 就这么简单;这意味着如果您有 png 文件但没有 jpeg 文件,您仍然可以将 png 移动到它们需要的位置而不会出现错误。
这是一个小演示,你可以看到我有 2 个图像文件和 1 个 zip 文件。脚本解压存档,然后收集所有 png 和 jpeg 并放入适当的目录中
$> ls
JPEGS/ Pictures.zip PNGS/ rMzMHd7.jpg waves.png*
$> pwd
/home/xieerqi/TESTDIR
$> bash /home/xieerqi/cleanup_directory.sh
Archive: /home/xieerqi/TESTDIR/Pictures.zip
inflating: /home/xieerqi/TESTDIR/ASDF.png
inflating: /home/xieerqi/TESTDIR/IMG20160117233913~01.jpg
inflating: /home/xieerqi/TESTDIR/resized_Screenshot from 2016-01-10 08:52:10.png
$> ls
JPEGS/ Pictures.zip PNGS/
$> ls JPEGS
IMG20160117233913~01.jpg rMzMHd7.jpg
$> ls PNGS/
ASDF.png resized_Screenshot from 2016-01-10 08:52:10.png waves.png*
$>
脚本本身如下:
# Set here the working directory and the destinations
DIR="/home/xieerqi/TESTDIR"
PNG_DIR="/home/xieerqi/TESTDIR/PNGS"
JPEGS_DIR="/home/xieerqi/TESTDIR/JPEGS"
# Find all zip files in dir and extract them
# If not found, the script just continues on
find $DIR -maxdepth 1 -type f -iname "*.zip" -exec unzip {} -d $DIR \;
# Find all png files in the dir and move them to PNG_DIR
# use cp instead of mv if you are worried about loosing files
find $DIR -maxdepth 1 -type f -iname "*.png" -exec mv -t $PNG_DIR {} \+
# Find all JPEG/JPG files and throw them into JPENGS_DIR
# use cp if you are worried about loosing files
find $DIR -maxdepth 1 -type f \( -iname "*.jpg" -o -iname "*.jpeg" \) -exec mv -t $JPEGS_DIR {} \+