파일 이름으로 단일 정수를 사용하여 각 파일 이름에 ‘0’을 추가하고 싶습니다.
1.jpg-> 01.jpg
다음 명령을 사용했지만 아무것도하지 않았습니다.
문제 나 다른 조치를 말할 수 있습니까? :
find . -maxdepth 1 -type d \( ! -name . \) -exec fish -c "cd '{}' ;
for f in *;
if [ (string length '$f') -eq '5' ];
mv '$f' '0$f';
end;
end; " \;
동일한 명령이 명령 줄에서 작동하지 않는 것 같지만 스크립트를 통해 호출 할 때는 작동하지 않습니다. 스크립트에서 seq (명시 적으로 언급 된 범위없이)를 호출하려고 할 때도 마찬가지입니다. “missing operand”라고 말합니다.
답변
이것이 당신을 위해 작동하는지 확인하십시오 :
find . -maxdepth 1 -type f -name "[0-9].???" -printf "mv \"%p\" \"%h/0%f\"\n"
현재 디렉토리에서 한 자릿수로 구성되고 3 자 확장자로 끝나는 모든 파일을 찾습니다. 파일 대신 디렉토리를 원하면 (예에서 -type f
와 같이)로 바꾸십시오 -type d
. 더 긴 확장을 허용해야하는 경우 검색 패턴을 조정할 수 있습니다. 재귀 적으로 검색해야하는 경우 -maxdepth 1
매개 변수를 제거하십시오 . 이 명령의 출력은 이름 바꾸기를 수행하기 위해 실행되는 명령입니다. 예를 들면 다음과 같습니다.
$ ls
10.png 1.png 2.png 3.png
$ find . -maxdepth 1 -type f -name "[0-9].???" -printf "mv \"%p\" \"%h/0%f\"\n"
mv "./3.png" "./03.png"
mv "./2.png" "./02.png"
mv "./1.png" "./01.png"
출력이 올바르게 보이면 find 명령의 출력을 쉘로 파이프하여 실행할 수 있습니다.
$ find . -maxdepth 1 -type f -name "[0-9].???" -printf "mv \"%p\" \"%h/0%f\"\n" | fish
$ ls
01.png 02.png 03.png 10.png
답변
find
명령을 포함하지 않는 생선 솔루션 은 다음과 같습니다.
#!/usr/bin/env fish
for f in *.jpg
if string match -qr '^\d\.' -- $f
mv $f 0$f
end
end
for f in **/*.jpg
set p (string split --right --max=1 / -- $f)
if string match -qr '^\d\.' -- $p[2]
mv $f $p[1]/0$p[2]
end
end
현재 디렉토리의 jpg 파일과 모든 하위 디렉토리를 모두 얻는 단일 for 루프를 사용 하여이 작업을 수행 할 수 있습니다.
for ***.jpg
do stuff
end
그러나 cwd의 파일에는 디렉토리 구성 요소가 없으므로 for 블록 내부의 논리가 복잡해집니다.