여러 폴더의 여러 파일을 하나의 폴더로 복사하고 복사된 디렉터리에 따라 이름을 변경하는 방법은 무엇입니까?
초기 디렉터리 계층 구조:
folder1/
file1.gz
filexyz.gz
folder2/
file1.gz
filexyz.gz
folder3/
file1.gz
filexyz.gz
결과:
folder1_file1.gz
folder2_file1.gz
folder3_file1.gz
folder1_filexyz.gz
folder2_filexyz.gz
folder3_filexyz.gz
답변1
간단한 쉘 루프를 사용하여 파일을 값으로 지정된 디렉토리에 복사해야 한다고 가정합니다 $destdir
.
for pathname in */*.gz; do
cp -i -- "$pathname" "$destdir/$( dirname -- "$pathname" )_$( basename -- "$pathname" )"
done
답변2
사전 이름/이름 바꾸기(Larry Wall의 Perl 이름 바꾸기라고도 함) 사용( rename
Debian/Ubuntu, prename
RHEL/CentOS, IIRC에서):
folder1
, , folder2
의 상위 항목 folder3
:
rename -n s:/:_: */*
-n
"시험 실행" 매개변수입니다. 이름 변경이 좋아 보이면 "-v"로 바꾸거나 제거하세요.
기본적으로 이는 현재 디렉터리에서 현재 디렉터리 directory/file
로 파일을 이동합니다. directory_file
여러 폴더 수준이 있고 bash를 사용하는 경우 다음을 사용할 수 있습니다.
shopt -s globstar # Possibly already set, necessary for the "**"
rename -n s:/:_:g **/*
그러면 파일이 현재 디렉터리에서 현재 디렉터리 some/path/to/file
로 이동됩니다.some_path_to_file
답변3
이 같은?
#!/bin/bash -ex
DESTDIR="PATH/TO/FINAL/DESTINATION/DIRECTORY"
for DIRS in /PATH/TO/YOUR/DIRECTORIES/*/;
do
for FLES in $DIRS*.gz;
do
cp $FLES $DESTDIR/$(echo $(basename $DIRS)"_"$(basename $FLES))
done
done
편집: OP가 문제를 스스로 해결하려고 시도했다는 것을 보여주지 않았기 때문에 코드에 설명을 추가하기에는 너무 게으르다. 하지만 무슨 일이 있어도 우리는 도와야 합니다. 그래서 제가 이 글을 게시하는 이유입니다.
답변4
이 시도,
find folder[1-3] -type f -name '*.gz' | while read -r FILE; do cp "$FILE" "${FILE//\//_}"; done
folder[1-3]
소스 위치.-type f
파일만 검색합니다.-name '*.gz'
파일 이름 접미사는 입니다.gz
.${FILE//\//_}
"/"를 밑줄로 바꾸세요.