특수 문자가 포함된 파일을 새 디렉터리로 이동

특수 문자가 포함된 파일을 새 디렉터리로 이동

특정 디렉터리의 특수 문자를 확인하고 해당 파일을 특정 디렉터리로 이동하는 스크립트에 대한 루프를 작성하려고 합니다(공백과 하이픈은 제외). 이것들은 밑줄로 대체되고 해당 디렉터리에 남아 있습니다. 이것을 얻었습니다. 스크립트가 완료되었습니다). 여기와 Stack Overflow에서 찾은 몇 가지 가능성을 조사한 결과 꽤 잘 일치하지만 그 중 어떤 것도 원하는 대로 작동하도록 할 수 없습니다.

    for i in /home/*; do

            case $i in
                 *\?*||*\**||*\$*||*\%*||*\.*||*\'*||*\"*||*\**||*\,* )
            mv home/failed;
            esac

    done

이 작업을 수행하는 더 짧거나 더 나은 방법이 있다면 반드시 이것이일 필요는 없습니다.

미리 감사드립니다. 당신은 정말 대단합니다! IT 학사가 가르쳐준 것보다 Stack Overflow, U&L 등의 사이트에서 더 많은 실용적인 정보를 배웠습니다.

답변1

여기서 주목해야 할 점은 유닉스 파일 이름에는 '/' 및 '\0'을 제외한 모든 8비트 문자 값을 가진 문자가 포함될 수 있다는 것입니다.

[AZ], [az] 또는 밑줄 이외의 문자가 포함된 파일을 이동하려면 다음 명령을 사용하십시오.

for file in /home/*; do
    filename=${file##*/}
    [ -n "${filename//[A-Za-z_]/}" ] && mv "$file" failed/
done

먼저 디렉터리 경로를 제거하고 파일 이름만 남겨 두는 방식으로 작동합니다. 그런 다음 파일 이름에서 "합법적인" 문자를 모두 제거합니다. 문자가 남아 있으면 파일 이름에 잘못된 문자가 포함되어 이동됩니다.

답변2

이는 스크립트에서 사용하기 위해 수정될 수 있어야 하지만 명령줄에서 이 작업을 수행하는 경우에도 그렇게 할 수 있습니다 ls -i. 그러면 디렉터리의 각 파일에 대한 inode가 제공됩니다. 여기에서 find를 사용할 수 있습니다:

find ./ -i $INODE -exec mv {} <target> \;

관련 정보