Synology NAS에서 많은 파일의 이름을 바꾸는 쉬운 방법을 찾고 있습니다. 찾았으며 sed
사용 가능하지만 사용할 수 없습니다 rename
.
다음을 사용하여 이러한 파일 및 폴더 목록을 얻을 수 있습니다.
find . \( -type d -name "@*" -prune \) -o \( -name "**" \) -print
위의 find 문은 Synology bash에서 ""로 대체된 "/" 문자를 포함하는 모든 파일을 표시합니다.
바꿔야 할 모든 특수 문자는 다음과 같습니다.
/ \ : ? ' ’ ´ ’
사용되는 플랫폼 및 파일 공유 프로토콜에 따라 이러한 문자는 다르게 보이거나 다르게 표시되거나 전혀 표시되지 않거나 다양한 유형의 문제를 유발합니다. 다음을 통해 Synology bash에서 이러한 문자를 찾을 수 있습니다.
-name "**" -o -name '*\\*' -o -name "*:*" -o -name "*\?*" -o -name "*\'*" -o -name "*´*" -o -name "*`*"
찾은 모든 파일과 디렉터리에서 이러한 문자를 어떻게 바꿀 수 있습니까? "/" 문자부터 시작하겠습니다.
도와주셔서 감사합니다!
게리
답변1
find
명령이 이름을 바꾸려는 파일 세트와 정확히 일치하고 이름을 "안전한" 파일 이름으로 바꾸려고 한다고 가정합니다 . 파일 이름의 정확한 문자를 모르면 제안만 드릴 수 있지만 여기에는 두 가지가 있습니다.
이상한 문자를 제거하십시오. 이는 문자를
bash
대체하여 기본적으로 처리 할 수 있다고 가정합니다.find . -depth \( -type d -name "@*" -prune \) -o \( -name "**" -execdir \ bash -c 'echo "Processing $PWD"; for f; do echo mv -- "$f" "${f///}"; done' _ {} + \)
알려진 문자만 유지됩니다.
tr
보존하려는 문자 세트가 포함되어 있는지 확인하십시오 .find . -depth \( -type d -name "@*" -prune \) -o \( -name "**" -execdir \ bash -c 'echo "Processing $PWD"; for f; do echo mv -- "$f" "$(tr -cd '[:alnum:][:punct:][:space:]' <<<"$f")"; done' _ {} + \)
두 경우 모두 echo
디버깅을 활성 문으로 변환하려면 제거하세요.
답변2
for 루프를 사용하는 것에 대한 대안은 다음과 같습니다.
# Option globstar activates the ** (search recursivelly).
# Option nullglob removes an * when it matches no file/dir.
$ shopt -s globstar nullglob
$ for i in **/*; do
# if the name of the file matches the pattern
# perform the `mv` command
[[ "$(basename "$i")" =~ ^@.*$ ]] && \
mv -- "$i" "$(echo "$i" | sed -e 's;^@;;' -e 's;/@;/;')"
[[ "$(basename "$i")" =~ ^**$ ]] && \
mv -- "$i" "$(echo "$i" | sed 's;;;')"
done
참고: 이동/삭제 명령을 실행하기 전에 백업을 만드는 것이 가장 좋습니다.
답변3
find 명령이 원하는 결과를 제공하는 경우 이를 sed로 파이프한 다음 sed에서 bash로 파이프할 수 있습니다(또는 bash/ash로 파이프하는 대신 파일로 리디렉션).
find . \( -type d -name "@*" -prune \) -o \( -name "**" \) -print | sed -n 's/\(.*\)\(\)\(.*\)/mv '"'&'"' '"'\1\3'"'/p' | bash
- find 명령은 원하는 파일과 디렉토리를 나열합니다.
- sed는 모든 줄을 반복하고 특수 문자를 대체/제거하며 각 줄을 bash/ash(mv) 실행으로 설정합니다.
또는 sed를 파일로 리디렉션하고 파일을 bash/ash할 수 있습니다(bash list_of_files_and_dirs_to_be_renamed). 실제 데이터에 사용하기 전에 중요하지 않은 파일/디렉토리에 대해 좋은 테스트를 수행하십시오.