명령 행의 각 서브 디렉토리에서 명령 실행 싶습니다. 1.jpg-> 01.jpg 다음 명령을

파일 이름으로 단일 정수를 사용하여 각 파일 이름에 ‘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 블록 내부의 논리가 복잡해집니다.