디렉터리 및 하위 디렉터리의 모든 항목에서 공백을 제거합니다.

디렉터리 및 하위 디렉터리의 모든 항목에서 공백을 제거합니다.

파일과 하위 디렉터리가 있는 디렉터리가 있는데 그 중 일부는 이름에 공백이 포함되어 있습니다. 또한 각 하위 디렉터리에는 이름에 공백이 있는 파일이 포함되어 있습니다. 상위 디렉터리와 모든 하위 디렉터리의 모든 이름에서 공백을 한 번에 제거하는 쉬운 방법이 있습니까?

답변1

find이름을 바꿔야 하는 파일을 열거하려면 이 명령을 사용하십시오 . 성능을 향상하려면 공백이 포함된 파일 이름만 선택하세요. 디렉터리를 탐색하는 동안 디렉터리 이름을 바꾸면 일부 디렉터리가 손실될 수 있으므로 -depth디렉터리 자체에서 작업하기 전에 하위 디렉터리의 파일에서 작동하는 옵션을 전달합니다 .find

find /path/to/directory -depth -name '* *' -exec … {} +

당신이 가지고 있다면prenamePerl 표현식을 적용하여 파일 이름을 바꾸는 명령입니다. 전체 디렉터리 경로가 아닌 파일의 기본 이름에 대해서만 작업하도록 주의해야 합니다. find이 경우 -execdir편리한 방법은 다음과 같습니다.

find /path/to/directory -name '* *' -execdir prename 's/ //g' {} +

s/ //g대체 방법 은 s/ /_/g공백을 직접 제거하는 대신 밑줄로 바꾸 거나 s/ +/_/g일련의 공백을 단일 밑줄로 바꿉니다.

-execdirPerl 코드에서는 디렉토리 회피 논리 가 필요하지 않습니다 .

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' "{}" \;

추가 읽기

행운을 빌어요!

관련 정보