
터미널에서 파일을 쉽게 이동할 수 있습니다. 매일 학생들이 제출한 자료가 너무 많아서 저녁에 제출한 모든 사진(일반적으로 JPG 및 PNG)을 하나의 디렉토리로 옮기는 작업을 수행하면 인생이 훨씬 쉬워질 것입니다. 모든 텍스트 내용을 다른 사람에게 보냅니다.
일종의 명령을 사용하여 기본적인 것을 작성할 수 있지만 mv *.jpg
해당 유형의 파일이 없으면 전체 스크립트가 실패하고 시간을 절약하는 전체 작업이 무의미하다고 가정합니다.
문제를 추가하기 위해 고등학생 몇 명이 zip으로 제출하므로 스크립트에서 먼저 추출할 수 있도록 하고 싶습니다.
따라서 TL;DR - 특정 유형의 파일이 없어 발생하는 오류에 대해 중지하지 않고 zip을 추출하고 파일을 이동합니다.
답변1
전체 스크립트가 실패할 것이라고 가정합니다.
그렇지는 않습니다. 단일 명령만 "실패"하지만( *.jpg
globbing 패턴이 literal로 확장되어 *.jpg
이름이 지정된 파일이 존재하지 않는 경우 명령에서 오류가 발생함을 의미함 *.jpg
) 스크립트는 계속 실행됩니다. 오류에도 불구하고. 따라서 대부분의 경우 이는 문제가 되지 않습니다. 그러나 The Right Way™ 작업을 수행하려면 failglob
globbing 패턴이 포함된 명령을 실행하기 전에 활성화하십시오.
shopt -s failglob
쉘
failglob
옵션이 설정되어 있고 일치하는 항목이 없으면 오류 메시지가 인쇄되고 명령이 실행되지 않습니다.
현재 작업 디렉토리의 모든 .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 {} \+