모든 파일을 확장자별로 폴더에 저장하는 스크립트를 실행하여 데스크탑을 정리하고 싶습니다. 인터넷 검색을 통해 일부 코드를 찾았고 찾은 코드는 파일 이름으로 폴더를 생성하고 해당 폴더에 파일을 배치합니다. 파일 이름당 하나의 폴더를 원하지 않습니다... 모든 .txt를 포함하는 폴더 하나, .jpg를 포함하는 다른 폴더... 등을 원합니다. 저는 OS X를 사용합니다.
이것이 제가 가지고 있는 것입니다... 어떤 방향으로든 좋을 것 같습니다. 감사합니다!
for file in *.txt
do
dir="${file%.txt}"
mkdir -- "$dir"
mv -- "$file" "$dir"
done
답변1
원하는 것이 파일 유형별 디렉토리라면 다음과 같은 것을 원할 것입니다.
mkdir txt || { echo "Can't mkdir txt" ; exit 1 ; }
for file in *.txt ; do
mv -- "$file" txt/
done
위의 문제 해결에 주의를 기울이십시오 mkdir
. 코드에 이미 있는 경우문서변수에 포함된 이름을 사용하면 $dir
명령 mkdir --"$dir"
이 실행됩니다.아무 말 않고실패하면 mv
명령이 실행됩니다.씌우다그 파일.
임의로 이름이 지정된 여러 파일(현재 디렉터리에 있는 3자 확장자를 가진 모든 파일)을 처리하고 파일 확장자로 디렉터리에 넣으려면 다음 코드(테스트되지 않음)를 사용할 수 있습니다.
for file in *.??? ; do
[ -f "$file" ] || continue
dir="$(echo "$file" | rev | cut -c-3 | rev)"
mkdir -p "$dir" || { echo "Couldn't mkdir -p $dir; exiting" ; exit 1 ; }
mv -- "$file" "$dir"
done
설명하다:
이 패턴은 *.???
모든 파일과 일치합니다.및 디렉토리현재 디렉터리에서 해당 이름은 .
마침표( )로 끝나고 그 뒤에 세 문자가 옵니다.
[ -f "$file" ]
테스트는 일반 파일인 경우 에만 true를 반환합니다 (디렉토리나 장치와 같은 더 특수한 유형이 아님) . 그렇지 않으면 명령문은 루프의 나머지 부분을 건너뜁니다.$file
continue
for
변수에 대한 할당은 dir
멋져 보이지만 실제로는 변수의 내용을 가져와 $file
반전하고 (역전된 문자열의) 처음 3자를 추출하고 다시 반전한 다음 결과를 의 값으로 할당합니다 $dir
. 즉, 파일 이름의 마지막 세 글자입니다.
그런 다음 mkdir -p
디렉터리가 이미 있으면 성공이 반환되고, 디렉터리가 없으면 생성됩니다(그리고 성공이 반환됩니다). 성공을 반환하지 않으면 파일을 그 곳으로 옮기고 싶지 않을 것입니다! 따라서 오류 처리.
그러면 mv
명령은 평소와 같습니다.
오류 처리에 대한 참고 사항:
다음과 같은 구조를 볼 수 있습니다.
mkdir -p "$dir" || echo "Failed, exiting" && exit 1
명령은 다음 과 같은 exit
경우에만 실행되므로 완벽하지는 않습니다 .echo
성공명령이 실패한 후 mkdir
. 대신, 당신이 원하는 것은 exit
실행 명령을 갖는 것입니다에도 불구하고명령이 echo
성공했는지 여부( mkdir
실패했다고 가정) 그래서 위의 중괄호를 사용했습니다.
답변2
원하는 것이 파일 유형별 디렉토리라면 다음과 같은 것을 원할 것입니다.
for file in *.*[!.]
do
ext=${file##*.}
mkdir -p -- "$ext" && mv -- "$file" "$ext"/
done
다른 운영 체제와 달리 Unix에서는 *.*
모든 파일을 참조하는 것이 아니라 이름으로 모든 파일을 참조합니다.포함하다적어도 하나 .
(점, 일명 마침표)이므로 txt
, todolist
및 와 같은 이름의 파일은 생략됩니다 oddball
. (문제를 혼동하기 위해 쉘 와일드카드는 이름이 다음과 같은 파일을 제외합니다.시작.
이 옵션이 설정되지 않은 경우. ) (또는 이에 상응하는) 이름이 추가로 제한된 파일dotglob
*.*[!.]
*.*[^.]
포함하다마지막 하나.
하지만 .
마지막 문자가 없으면, 따라서 oddball.
및 유사한 이름을 가진 파일을 생략합니다 odd.ball.
. AFAICT, 이것은 이름이 비어 있지 않은 확장자를 가진 파일을 잘 표현한 것입니다.
ext=${file##*.}
마지막 점까지 모두 제거하여 확장자를 추출합니다. 위의 분석이 정확하다면 값은 null이 아니어야 합니다. 인수가 이미 존재하고 디렉터리인 경우 이 -p
옵션은 실패하지 않습니다 . mkdir
, 및 와 같은 이름의 일반 파일과 ( 와 같은 이름의 파일이 있는 경우 txt
) 또는 pdf
다른 극단적 인 경우(예: 현재 디렉터리에 쓰기 권한이 없거나 남은 공간이 없는 경우) 파일에 체계),jpg
shopping_list.txt
ext=txt
mkdir
~ 할 것이다실패하고 자체 진단 메시지를 내보냅니다. 그리고 (@Wildcard가 제안한 대로) &&
다음은 시도되지 않습니다 .mv
명령 /
끝에는 및 이름이 지정된 일반 파일 mv
의 손상을 방지하는 안전망이 있습니다 txt
.pdf
jpg
mv -- "$file" "$ext"/
대상 이름이 일반 파일(또는 디렉터리 이외의 파일 형식)로 존재하는 경우에만 실패합니다.