다음 이름을 가진 여러 디렉터리를 만들 수 있는 bash 함수 스크립트를 만들려고 합니다. 또한 파일을 확장자별로 적절한 폴더에 정리하려고 했습니다(예: .jpg는 사진으로, .doc는 문서로, .gif는 미디어로 등). 첫 번째 부분은 좋지만 디렉토리가 생성된 후 두 번째 부분은 나를 혼란스럽게 합니다.
#!/bin/bash
echo "Creating directory categories"
function make_folder
{
cd -; cd content; sudo mkdir ./$1
}
make_folder "documents"
make_folder "other"
make_folder "pictures"
make_folder "media"
echo "Directories have been made"; cd -
exit
ext="${filename##*.}" #set var ext to extension of files
find ./random -name | #find and list all files in random folder
#pipe results of find into if statement
if ext == ["jpg"; "jpeg"; "png"] #move ".jpg", etc to new destination
then
mv /path/to/source /path/to/destination
elif ext == [".gif"; ".mov"] #move ".gif", etc to new destination
then
mv /path/to/source /path/to/destination
else #move other files into to new destination
mv /path/to/source /path/to/destination
fi
답변1
내 머리 꼭대기에서 나는 "case"문을 사용하게 될 것입니다.
즉
case "$FILE" in
*.jpg|*.jpeg)
mv "$FILE" to where you want it
;;
*.gif|*.mov)
mv "$FILE" to where you want it
;;
*)
echo "Unmanaged file type: $FILE, skipping"
;;
esac
...하지만 루프 컨테이너로 포장해야 하며 확실히 find를 사용하고 싶다면 적합할 수 있습니다.
find <your stuff> |
while read FILE
do
...case statement goes here
done
그냥 내 $0.02
건배! / 다니엘
답변2
귀하의 make_folder
기능은 불필요하게 복잡합니다. 이러한 현재 디렉토리 변경은 귀하의 삶을 더욱 복잡하게 만들 뿐입니다. 무엇보다도 다음과 같은 작업이 필요하지 않습니다 sudo
. 루트로 디렉토리를 만드는 이유는 무엇입니까? 그냥 전화하세요 mkdir
.
mkdir documents other pictures media
디렉토리가 이미 존재하는 경우에도 스크립트가 작동하도록 하려면 다음을 사용하십시오 mkdir -p
.
mkdir -p documents other pictures media
를 사용하려면 find
이름을 인쇄한 다음 구문 분석하지 마세요. find
원하는 코드를 실행 해 보세요 -exec
. 간단한 프로그램을 호출하는 것 외에도 쉘을 호출할 수도 있습니다. 의 경우 <code>sh -c '<em>shell code</em>'
쉘 코드 다음의 매개변수는 sh
쉘 코드에서 로 사용할 수 있습니다 $0
.변수 대체에는 항상 큰따옴표를 사용하세요.. 껍질 조각에서 확장을 통해 구별하는 자연스러운 방법은 다음을 사용하는 것입니다.사례파일 이름을 기준으로 구성됩니다. 나는 사용한다매개변수 확장${0##*/}
파일의 기본 이름을 가져오기 위해 구성되었습니다 (마지막 슬래시 앞의 모든 항목을 제거). 이 테스트는 [ -e "$destination_file" ]
다른 디렉토리에서 이동된 동일한 이름의 파일을 덮어쓰지 않도록 대상 파일이 이미 존재하는지 테스트합니다.
find random -exec sh -c '
case "$0" in
*.gif|*.png|*.jpg) destination_directory=pictures;;
…
*) destination_directory=other;;
esac
destination_file="$destination_directory/${0##*/}"
if [ -e "$destination_file" ]; then mv "$0" "$destination_file"; fi
' {} \;
또 다른 방법은 대상별로 파일을 복사하는 것인데, 파일 수가 많으면 속도가 느려질 수 있지만 작성하는 것이 훨씬 간단합니다. Linux에서는 GNU 유틸리티 덕분에 다음과 같이 간단합니다.
find random \( -name '*.gif' -o -name '*.png' -o -name '*.jpg' \) -exec mv -n -t pictures {} +
다른 대상 디렉터리에도 마찬가지입니다. 작업 속도를 높이려면 마지막에 일괄 호출 +
대신 사용하세요 .;
find -exec
mv
그러나 실제로 bash나 zsh에서 수행 중인 작업에는 find
.**
와일드카드재귀적 디렉터리 탐색에 사용됩니다.
shopt -s globstar # necessary in bash to enable **
mv -n random/**/*.gif random/**/*.png random/**/*.jpg pictures/
모든 파일을 대상 디렉토리에 직접 배치한다고 가정합니다. 디렉터리 계층 구조를 재현하려는 경우에는 이야기가 다르며 다른 도구가 적합할 것입니다.