find를 사용하여 여러 파일 이름을 작업하는 방법은 무엇입니까?

find를 사용하여 여러 파일 이름을 작업하는 방법은 무엇입니까?

파일 이름의 문자열을 변경하려면 다음 명령을 어떻게 개선할 수 있습니까?

find . -type f -name '*<today>*' -exec mv {} {}_renamed \;

사실 내 디렉토리에는 이름에 오늘 날짜가 포함된 파일이 몇 개 있습니다. 파일 이름 중 날짜 문자열만 오늘 날짜에서 어제 날짜로 변경되도록 모든 파일의 이름을 변경하고 싶습니다.

파일 이름에 접미사나 접두사를 추가하고 싶지 않고 오히려 파일 이름을 조작하고 싶습니다.

예를 들어,
명령 파일 이름 앞에는 xxx20170821yyyy.ppp
명령 파일 이름이 옵니다.xxx20170820yyyy.ppp

그리고 이름에 문자열이 포함된 모든 파일에 대해 이 작업을 반복합니다 20170821.

답변1

renamePerl 명령의 일부로 사용됩니다 .

find . -type f -name '*20170919*' -execdir 
rename -n 's/20170919/20170918/' '{}' \;

execdir반환된 상대 경로에 있는 파일에 대해 실행하기 위해 명령의 일부를 실행할 때 사용됩니다 execdir. 이렇게 하면 파일의 전체 경로(현재 작업 디렉터리 기준)가 전달되지 않고 동일한 폴더를 사용하지 않게 됩니다.무늬이름 바꾸기 오류는 파일 이름 자체가 아닙니다.

모든 파일이 단일 디렉터리에 있으면 다음 줄로 rename충분합니다.

rename -n 's/20170919/20170918/' *20170919*

-n이름 변경으로 인해 실제 이름이 변경되었다고 생각되면 삭제하세요. -v이름이 바뀌는 내용을 보려면 추가해야 할 수도 있습니다 .

마지막으로, 매일 여러 파일에 대해 이 작업을 수행하려면 오늘 날짜가 필요할 수 있습니다. 그런 다음 큰따옴표 사이에 date다음 명령 $(...)(명령 대체) 을 사용하십시오.

find . -type f -name "*$(date +"%Y%m%d")*" -execdir 
rename -n "s/$(date +"%Y%m%d")/$(date -d "-1day" +"%Y%m%d")/" '{}' \;

추신, 쉘을 사용하고 있으므로 대신 csh를 사용 하거나 새 쉘로 전환 하는 것이 더 좋습니다 .`...`$(...)bashzsh

find ./ -type f -name "*`date +"%Y%m%d"`*" -execdir 
rename -n "s/`date +"%Y%m%d"`/`date -d "-1day" +"%Y%m%d"`/" '{}' \;

관련 정보