建立一個腳本來移動忽略錯誤的文件

建立一個腳本來移動忽略錯誤的文件

我可以輕鬆地在終端機中移動文件。我每天都會收到學生提交的一堆亂七八糟的東西,如果我能在晚上運行一件事,將所有提交的照片(通常是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 {} \;結構的指令就足夠了。 Bellow 是一個結合了所有 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 {} \+

相關內容