좋아, 나는 여기서 원을 그리며 갈 것이다. 이 명령을 사용하고 있습니다
find . -print0 -name '*.1.*' | sed -e 'p;s/\.1//' | xargs -0 -n2 mv
".1"이 포함된 수백 개의 파일 이름을 바꿔보세요. 누군가 실수로 200GB의 데이터를 삭제한 후 보관할 때 파일 확장자 앞에 추가되었습니다.
파일 이름의 공백을 별도의 인수로 해석하는 mac xargs에 문제가 있으며 구분 기호를 공백이 아닌 개행 문자로만 설정할 수 없습니다. 인쇄되는 '\0' 문자와 그 사이에 있는 개행 문자를 찾는 방법을 모르겠습니다. 작동시키는 방법에 대한 아이디어가 있습니까? 나는 서클에서 검색해 왔으며 Mac 환경에 있는 것만으로도 필요 이상으로 복잡해졌습니다.
또는 명령 이름을 변경해 보았지만 여전히 문제가 있습니다.
find . -name '*.1.*' -type f -exec rename -n 's/\.1//' '{}' \;
아래 @Wildcard의 답변을 따르십시오.
find . -name '*.1.*' -type f -exec sh -c '
for f do
suf="${f##*.1}"
new="${f%.1.*}$suf"
if [ -e "$new" ]; then
printf "Cannot move file <%s>\n" "$new"
else
mv -n "$f" "$new"
fi
done
' find-sh {} +
답변1
다음은 항상 안전해야 하며 Mac에서 작동해야 합니다.
find . -name '*.1.*' -type f -exec sh -c '
for f do
suf="${f##*.1.}"
new="${f%.1.*}.$suf"
if [ -e "$new" ]; then
printf "Cannot move file <%s>\n" "$new"
else
mv -n "$f" "$new"
fi
done
' find-sh {} +
mv -n
출구를 주의하세요성공적으로기존 파일을 덮어쓰는 경우 파일 이름을 바꿀 필요가 없습니다. 이에 대해 보고할 수도 있습니다. 그래서 이것이 완료된 것입니다.
게다가 이상한 극단적인 경우에는 다음과 같은 경우가 있습니다.목차대상 새 이름을 사용하면 mv
내가 추가한 보안 검사 없이(사용된 경우에도 -n
) 파일이 해당 이름으로 이동됩니다. 이것도 바람직하지 않습니다.
.1.
파일 이름에 여러 문자열이 포함된 경우 이 명령은 마지막 문자열만 제거합니다. (이것이 삭제하는 것보다 나을 수도 있습니다.첫 번째하나는 그럴 것이다. )
-n
이론적으로는 스위치에 대해 안전 확인 if
블록을 전혀 사용할 필요가 없지만 경쟁 조건이 발생할 경우 데이터를 보호하기 위해 그대로 두었습니다(위의 파일을 이동하기 전에 다른 프로세스에서 대상 파일을 생성한 경우). 그 이름) .
가장 중요한 것은,파일 이름이 아무리 이상해도 폭발하지는 않습니다. 줄 바꿈, 작은따옴표 문자, 별표 및 기타 다양한 항목이 포함된 경우에도 마찬가지입니다.
그런데 곰곰이 생각해 보니아니요유니코드에서 bash 매개변수 확장이 얼마나 잘 작동하는지 결정합니다.