创建脚本来移动忽略错误的文件

创建脚本来移动忽略错误的文件

我可以很容易地在终端中移动文件。我每天都有学生提交的一大堆东西,如果能在晚上运行一个程序,将所有照片提交(通常是 JPG 和 PNG)移动到一个目录,将所有文本内容移动到另一个目录,我的生活就会轻松很多。

我可以使用一些基本的mv *.jpg命令来编写一些内容,但如果那里没有任何这类文件,那么我认为整个脚本都会失败,整个节省时间的练习都将毫无意义。

更复杂的是,我的几个高年级学生提交了 zip 文件,所以我希望能够先让脚本将它们提取出来。

因此,TL;DR - 提取 zip 并移动文件,而不会因为没有特定类型的文件而导致错误而停止。

答案1

我认为整个脚本都会失败

不会,只有单个命令会“失败”(这意味着*.jpg通配符模式将扩展为文字*.jpg,如果文件*.jpg不存在,这将导致命令抛出错误),但脚本将继续执行,尽管出现错误。因此在大多数情况下这不是问题,但是如果您想以正确的方式做事™,请failglob在运行包含通配符模式的命令之前启用:

shopt -s failglob

Bash 参考手册:文件名扩展

如果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 {} \+

相关内容