명령 행의 각 서브 디렉토리에서 명령 실행


1

파일 이름으로 단일 정수를 사용하여 각 파일 이름에 '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"라고 말합니다.


1
해당 스크립트에서 작동하는 것과 작동하지 않는 것은 무엇입니까? 루프에 에코를 사용하여 실제로 액세스 할 때마다 보려고 했습니까? 왜 검색을 사용하여 모든 jpg를 잡고 직접 이동하지 않습니까?
세스

그것이 내가 결국 한 일입니다. 처음부터 그에 따라 명명했다. 그러나 어류에 익숙하지 않고 (스크립팅조차도) 배우려고합니다. 명령은 명령 줄을 통해 입력하면 작동하지만 스크립트에서 호출하면 작동하지 않습니다. "seq"에서도 발생했습니다 ... 피연산자가 누락되었습니다. 이유를 모른다.
Rohan

답변:


1

이것이 당신을 위해 작동하는지 확인하십시오 :

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

알 수없는 데이터에서 명령 문자열을 작성하여 쉘로 파이프하는 것은 종종 나쁜 생각입니다. 예를 들어, 파일 이름에 a가 "있거나로 끝나는 경우 답변이 실패합니다 \.
Scott

0

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 블록 내부의 논리가 복잡해집니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.