Linux에서 재귀 적으로 파일 이름 바꾸기 (확장자 변경) 수천 개의

디렉토리의 모든 파일 이름을 재귀 적으로 바꾸어 수천 개의 하위 폴더에있는 수천 개의 파일에 대해 한 파일 확장자를 다른 파일 확장자로 변경하는 방법은 무엇입니까? 나는 내가 원하는 것을 거의 수행하지는 않지만 많은 명령을 봅니다.

find . -name "*.andnav" -exec rename .andnav .tile {} \;
syntax error at (eval 1) line 1, near "."

rename -nv 's/\.andnav$/\.tile/i' *.andnav
0.png.andnav renamed as 0.png.tile



답변

알아 냈어

find . -name "*.andnav" -exec rename -v 's/\.andnav$/\.tile/i' {} \;
./0/0.png.andnav renamed as ./0/0.png.tile
./0/1.png.andnav renamed as ./0/1.png.tile
./1/0.png.andnav renamed as ./1/0.png.tile
./1/1.png.andnav renamed as ./1/1.png.tile

물론 실제로 수행 할 때 -v를 제거하십시오. 그렇지 않으면 모든 파일을 표시하는 데 시간이 낭비됩니다


답변

다음과 같은 것 :

find . -name '*.andnav' -exec sh -c 'mv "$0" "${0%.andnav}.tile"' {} \;


답변

zsh로 :

autoload zmv
zmv -n '(**/)(*).andnav' '$1$2.tile'

-n실제로 이름을 바꾸려면를 제거하십시오 .


답변

이 방법이 더 쉽고 읽기 쉽다는 것을 알았습니다.

find . -name "*.andnav" | rename "s/\.andnav$/.tile/"

적어도 Ubuntu 파생에서 rename은 명령 줄에 아무것도 없으면 STDIN에서 파일 목록을 가져옵니다. 다음과 같이 쉽게 테스트 할 수 있습니다.

find . -name "*.andnav" | rename -vn "s/\.andnav$/.tile/"

당신이 그것을 얻을 때까지.


답변

파일 및 디렉토리 이름 변경 find -execdir | rename

단순히 접미사가 아닌 파일과 디렉토리의 이름을 바꾸려면 좋은 패턴입니다.

PATH="$(echo "$PATH" | sed -E 's/(^|:)[^\/][^:]*//g')" \
  find . -depth -execdir rename 's/findme/replaceme/' '{}' \;

awesome -execdir옵션 은와 달리 명령을 cd실행하기 전에 디렉토리를 수행합니다 .rename-exec

-depth 부모 디렉토리가 누락 될 때 발생할 수있는 잠재적 인 문제를 방지하기 위해 이름 변경은 먼저 자식에서, 그런 다음 부모에서 일어나야합니다.

-execdir 이름이 아닌 이름이 아닌 입력 경로에서 이름이 제대로 재생되지 않기 때문에 필수입니다 (예 : 다음 실패).

rename 's/findme/replaceme/g' acc/acc

PATH때문에 해킹이 필요 -execdir하나 매우 짜증나는 단점이 find매우 독단적를하고 아무것도 할 거부 -execdir당신이 당신의 상대 경로가있는 경우 PATH예를 들어 환경 변수 ./node_modules/.bin와 실패를 :

find : 상대 경로 ‘./node_modules/.bin’이 PATH 환경 변수에 포함되어 있으며 find의 -execdir 조치와 함께 사용하면 안전하지 않습니다. $ PATH에서 해당 항목을 제거하십시오

참조 : /ubuntu/621132/why-using-the-execdir-action-is-insecure-for-directory-which-is-in-the-path/1109378#1109378

-execdirPOSIX에 대한 GNU 찾기 확장 입니다. renamePerl 기반이며 rename패키지 에서 제공 됩니다. 우분투에서 테스트 18.10.

미리보기 대안 이름 바꾸기

입력 경로가 출신이 아니 find거나 상대 경로 성가심이 충분하면 Perl lookahead를 사용하여 다음과 같이 디렉토리 이름을 안전하게 바꿀 수 있습니다.

git ls-files | sort -r | xargs rename 's/findme(?!.*\/)\/?$/replaceme/g' '{}'

나는 편리한 아날로그 발견하지 않았습니다 -execdirxargs: xargs를 : 변화를 실행하기 전에 파일 경로로 작업 디렉토리를?

sort -r더 이상 경로가 동일한 접두사와 짧은 사람 한 후 온 이후 파일이 각 디렉토리 이후에 올 수 있도록해야합니다.


답변