
이것은 제가 겪고 있는 간단한 문제이지만 잘 다루지 못하므로 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
.mmv
rename
util-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를 사용하여 질문에 태그를 지정했습니다.
에서는 sed
ERE 구문을 사용합니다(몇 가지를 피하기 위해 \
):
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
올바르게 처리됩니다.일부영.