Bash에서 파일 이름 중간에 선행 0을 제거합니다.

Bash에서 파일 이름 중간에 선행 0을 제거합니다.

이것은 제가 겪고 있는 간단한 문제이지만 잘 다루지 못하므로 sed빠른 도움을 주시면 대단히 감사하겠습니다.

결과적 split으로 모든 한 자리 숫자 블록에는 앞에 0이 붙습니다(예: BRNSPC_varID_chunk_07.txt). 밑줄 뒤의 선행 0을 제거하여 다음과 같이 보이도록 하고 싶습니다 BRNSPC_varID_chunk_7.txt. 뒤에 오는 0에 영향을 주고 싶지 않습니다(즉, BRNSPC_varID_chunk_70.txt유지 하고 싶습니다 BRNSPC_varID_chunk_70.txt). 누군가 이 모든 파일의 이름을 빨리 바꿀 수 있도록 도와줄 수 있나요? R에서 처리하는 방법을 모르는 R 스크립트에 오류가 발생합니다.

그리고 그 파일 중 하나는 BRNSPC_varID_chunk_00.txt... 그게 다였으면 좋겠습니다 BRNSPC_varID_chunk_0.txt.

감사해요

답변1

주어진

$ touch BRNSPC_varID_chunk_07.txt BRNSPC_varID_chunk_00.txt BRNSPC_varID_chunk_70.txt

그렇다면 적어도 bash, ksh,zsh

$ for f in ./*chunk_0?.txt; do echo mv "$f" "${f/chunk_0/chunk_}"; done
mv ./BRNSPC_varID_chunk_00.txt ./BRNSPC_varID_chunk_0.txt
mv ./BRNSPC_varID_chunk_07.txt ./BRNSPC_varID_chunk_7.txt

echo그것이 올바른 일을 할 것이라는 확신이 들면 제거하십시오.

chunk모호성이 없으면(즉, _0이름의 다른 곳에 시퀀스가 ​​나타날 수 없는 경우) 접두사를 제거할 수 있습니다.

from을 사용 하는 것과 같이 이식성이 떨어지는 솔루션 등이 많이 있습니다 rename.mmvrenameutil-linux

rename.ul -n -v chunk_0 chunk_ ./*chunk_0?.txt

( -n실제로 이름을 바꾸려면 제거하십시오).

답변2

사용 rename:

rename 's/(BRNSPC_varID_chunk_)0([0-9])/$1$2/' *.txt

*.txt.txt현재 디렉터리의 모든 파일 로 확장됩니다 .

BRNSPC_varID_chunk_0[0-9]이름 바꾸기는 첫 번째 일치 그룹이 있는 위치 BRNSPC_varID_chunk_와 두 번째 일치 그룹이 뒤에 오는 위치를 포함하는 모든 파일을 찾아 [0-9]첫 번째 및 두 번째 일치 그룹으로만 바꿉니다(그 사이의 0은 제거).

답변3

바꾸려는 문자열과 일치하는 올바른 정규식을 선택하는 것이 중요합니다.

sed를 사용하여 질문에 태그를 지정했습니다.

에서는 sedERE 구문을 사용합니다(몇 가지를 피하기 위해 \):

s#(chunk_)0+([0-9]+\.)#\1\2#

이렇게 하면 텍스트가 바뀌고 chunk_(첫 번째 역참조로 캡처됨 \1) 그 뒤에 임의의 숫자(최소 1개)의 (선행) 0, 0+임의의 숫자(최소 1개), 점이 뒤따르고 \.다음과 같이 변환됩니다. 역참조 \1\2(몇 개의 선행 0 제거).

오래되었지만 이식성이 더 높은 구문을 사용하면 다음과 같습니다.

s#\(chunk_\)0\{1,\}\([0-9]\{1,\}\.\)#\1\2#

그러면 다음이 변환됩니다.

for file in ./BRNSPC_varID_chunk*.txt; do
    filenew=$(echo "$file" | sed -E 's#(chunk_)0+([0-9]+\.)#\1\2#')
    echo mv -n "$file" "$filenew"
done

sed를 사용하는 것은 정규식을 지원하지 않는 쉘에서만 의미가 있습니다.

Bash에서는 다음과 같이 할 수 있습니다:

regex='(.*chunk_)0+([0-9]+\..*)'

for file in ./BRNSPC_varID_chunk*.txt; do
    if [[ $file =~ $regex ]]; then
        filenew=$(IFS=;printf '%s' "${BASH_REMATCH[@]:1}") 
        echo mv -n "$file" "$filenew"
    fi
done

그러면 다음 유형의 목록이 인쇄됩니다.

mv -n ./BRNSPC_varID_chunk_000000.txt ./BRNSPC_varID_chunk_0.txt
mv -n ./BRNSPC_varID_chunk_0000.txt   ./BRNSPC_varID_chunk_0.txt
mv -n ./BRNSPC_varID_chunk_00011.txt  ./BRNSPC_varID_chunk_11.txt
mv -n ./BRNSPC_varID_chunk_000.txt    ./BRNSPC_varID_chunk_0.txt
mv -n ./BRNSPC_varID_chunk_00.txt     ./BRNSPC_varID_chunk_0.txt
mv -n ./BRNSPC_varID_chunk_010.txt    ./BRNSPC_varID_chunk_10.txt
mv -n ./BRNSPC_varID_chunk_011.txt    ./BRNSPC_varID_chunk_11.txt
mv -n ./BRNSPC_varID_chunk_012.txt    ./BRNSPC_varID_chunk_12.txt
mv -n ./BRNSPC_varID_chunk_013.txt    ./BRNSPC_varID_chunk_13.txt
mv -n ./BRNSPC_varID_chunk_014.txt    ./BRNSPC_varID_chunk_14.txt
mv -n ./BRNSPC_varID_chunk_015.txt    ./BRNSPC_varID_chunk_15.txt
mv -n ./BRNSPC_varID_chunk_01.txt     ./BRNSPC_varID_chunk_1.txt
mv -n ./BRNSPC_varID_chunk_02.txt     ./BRNSPC_varID_chunk_2.txt
mv -n ./BRNSPC_varID_chunk_03.txt     ./BRNSPC_varID_chunk_3.txt
mv -n ./BRNSPC_varID_chunk_04.txt     ./BRNSPC_varID_chunk_4.txt
mv -n ./BRNSPC_varID_chunk_05.txt     ./BRNSPC_varID_chunk_5.txt
mv -n ./BRNSPC_varID_chunk_06.txt     ./BRNSPC_varID_chunk_6.txt
mv -n ./BRNSPC_varID_chunk_07.txt     ./BRNSPC_varID_chunk_7.txt
mv -n ./BRNSPC_varID_chunk_08.txt     ./BRNSPC_varID_chunk_8.txt
mv -n ./BRNSPC_varID_chunk_09.txt     ./BRNSPC_varID_chunk_9.txt
mv -n ./BRNSPC_varID_chunk_0.txt      ./BRNSPC_varID_chunk_0.txt

올바르게 처리됩니다.일부영.

관련 정보