파일과 하위 디렉터리가 있는 디렉터리가 있는데 그 중 일부는 이름에 공백이 포함되어 있습니다. 또한 각 하위 디렉터리에는 이름에 공백이 있는 파일이 포함되어 있습니다. 상위 디렉터리와 모든 하위 디렉터리의 모든 이름에서 공백을 한 번에 제거하는 쉬운 방법이 있습니까?
답변1
find
이름을 바꿔야 하는 파일을 열거하려면 이 명령을 사용하십시오 . 성능을 향상하려면 공백이 포함된 파일 이름만 선택하세요. 디렉터리를 탐색하는 동안 디렉터리 이름을 바꾸면 일부 디렉터리가 손실될 수 있으므로 -depth
디렉터리 자체에서 작업하기 전에 하위 디렉터리의 파일에서 작동하는 옵션을 전달합니다 .find
find /path/to/directory -depth -name '* *' -exec … {} +
당신이 가지고 있다면prename
Perl 표현식을 적용하여 파일 이름을 바꾸는 명령입니다. 전체 디렉터리 경로가 아닌 파일의 기본 이름에 대해서만 작업하도록 주의해야 합니다. find
이 경우 -execdir
편리한 방법은 다음과 같습니다.
find /path/to/directory -name '* *' -execdir prename 's/ //g' {} +
s/ //g
대체 방법 은 s/ /_/g
공백을 직접 제거하는 대신 밑줄로 바꾸 거나 s/ +/_/g
일련의 공백을 단일 밑줄로 바꿉니다.
-execdir
Perl 코드에서는 디렉토리 회피 논리 가 필요하지 않습니다 .
find /path/to/directory -depth -name '* *' -exec prename '
s:.*/::; $dir=$&;
s/ //g;
$_="$dir$_"
' {} +
그렇지 않은 경우 prename
쉘 스크립트를 사용하여 이를 수행할 수 있습니다. 쉘에서 호출해야 합니다 find
. ksh가 있는 경우 해당 ${file// /}
생성자를 사용하여 공백이 제거된 변수 값을 가져올 수 있습니다 file
( ${file// /_}
각 공백을 밑줄로 바꿈).
find /path/to/directory -depth -name '* *' -execdir ksh -c '
mv "$0" "${0// /}"
' {} \;
또는
find /path/to/directory -depth -name '* *' -exec ksh -c '
for file do
dir=${file%/*};
file=${x##*/};
mv "$dir/$file" "$dir/${file// /}";
done
' _ {} +
bash 또는 mksh가 있는 경우 ksh 대신 이를 사용할 수 있습니다. 그렇지 않은 경우 sed
문자열 처리에 사용할 수 있습니다 .
find /path/to/directory -depth -name '* *' -exec sh -c '
for file do
dir=${file%/*};
file=${x##*/};
without_spaces=$(printf %s "$file." | sed "s/ //g")
mv "$dir/$file" "$dir/${without_spaces%.}";
done
' _ {} +
답변2
상위 디렉터리와 모든 하위 디렉터리의 모든 이름에서 공백을 한 번에 제거하는 쉬운 방법이 있습니까?
바로 여기에:
find /tmp/ -depth -name "* *" -execdir rename 's/ /_/g' "{}" \;
행운을 빌어요!