내 Linux 시스템의 폴더에는 tar.gz 파일 이름과 일치하는 예제 이름이 포함된 텍스트 파일뿐만 아니라 여러 tar.gz 파일이 있습니다.
Current_directory
|_______TDF.tar.gz
|_______DFG.tar.gz
|_______GHY.tar.gz
현재 디렉터리의 names.txt 파일은 다음과 같습니다.
Tar.gz_filenames Sample_Names
DFG.tar.gz Sample2
TDF.tar.gz Sample1
GHY.tar.gz Sample3
따라서 일치 항목을 기반으로 Current_directory에서 다음 출력을 얻고 싶습니다.
Output:
Sample1.tar.gz
Sample2.tar.gz
Sample3.tar.gz
나는 성공하지 않고 다음을 시도했습니다.
for j in .tar.gz ; do
sed "s/\(\w\+\)\s\+\(\w\+\)/mv '*_\1$j' '*_\2$j'/e" names.txt
done
내 질문에 대한 작은 업데이트: 이 명령을 사용하면 cat -e names.txt
다음과 같은 내용이 표시됩니다.
Tar.gz_filenames Sample_Names^M$
DFG.tar.gz Sample2^M$
TDF.tar.gz Sample1^M$
GHY.tar.gz Sample3
답변1
파일 이름에 공백이 없다고 가정하는 또 다른 방법은 다음과 같습니다.
$ xargs -n2 echo mv -i <<<"$(sed '1d; s/$/.tar.gz/' names.txt)"
mv -i TDF.tar.gz Sample1.tar.gz
mv -i DFG.tar.gz Sample2.tar.gz
mv -i GHY.tar.gz Sample3.tar.gz
에서는 입력 파일 이름의 첫 번째 줄을 제거 sed '1d; s/$/.tar.gz/'
하고 각 줄 끝에 (줄 끝에 ponits)를 추가합니다 .1d
names.txt
s/$/.tar.gz/
.tar.gz
$
xargs -n2
공백/또는 탭으로 구분된 두 세트의 문자열을 읽고 있습니다 .
노트:
cat -e names.txt
파일의 출력이 Unix 형식의 줄 끝 형식이 아니므로 Unix 형식으로 변환한 후 위dos2unix fileName
의 명령을 적용하여 이름을 변경합니다.테스트 실행을 위해 제거하세요
echo
.
다음으로 연결그것은 무엇 ^M
이며 어떻게 제거합니까?
답변2
names.txt
표시된 대로 이름에 공백이 없고 파일의 첫 번째 줄에 제목이 있다고 가정하면 다음과 같이 할 수 있습니다.
tail -n +2 names.txt | while read old new; do
mv -i "$old" "$new"
done
두 번째 줄부터 시작하여 파일의 모든 줄을 인쇄하므로 tail -n +2
헤더를 건너뜁니다. 그런 다음 -i
GNU의 옵션은 mv
기존 파일을 덮어쓰기 전에(이름이 충돌하는 경우) 프롬프트를 표시하도록 지시합니다.
답변3
셸 사용: tar 파일 이름에 공백이 포함되어 있지 않고 예제 이름에도 공백이 포함되어 있지 않다고 가정합니다.
{
read header
while read -r tarfile sample; do
if [[ -f "$tarfile" ]]; then
echo mv "$tarfile" "$sample.tar.gz"
fi
done
} < names.txt
답변4
입력 파일 형식을 고려하면 sed
다음 명령 하나로 충분합니다.
sed '1!{s/^/mv /;s/$/.tar.gz/e}' names.txt
데모, 아니요 e
:
sed '1!{s/^/mv /;s/$/.tar.gz/}' names.txt
산출:
Tar.gz_filenames Sample_Names
mv TDF.tar.gz Sample1.tar.gz
mv DFG.tar.gz Sample2.tar.gz
mv GHY.tar.gz Sample3.tar.gz