일종의 폴더(A,B,C,D,E,F,G,H)가 있고 각 폴더에는 모든 폴더에 동일한 이름의 파일(file.txt)이 있지만 파일의 크기는 다음과 같습니다. 폴더에서 폴더로. 이 파일을 각 폴더에서 새 폴더(X)로 복사하고 파일 이름을 원본 폴더와 동일하게 지정하고 싶습니다. 이 bach 스크립트를 사용하여 파일을 복사합니다.
#!/bin/bash
insub_FIM_M_1=path to a parent folder conatin all the folders (A,B,C,D,E,F,G,H)
for i in $(cat $insub_FIM_M_1/FIM_1.txt); do
cp insub_FIM_M_1/${i} <path to the new folder X >
done
이 코드에서는 모든 파일이 폴더 내 이름이 동일하므로 새 폴더(X)에서 모든 파일을 덮어씁니다. 파일의 출처를 알 수 있도록 파일 이름에 폴더 이름을 추가하려면 이 코드를 어떻게 수정해야 합니까?
답변1
디렉터리가 상위 디렉터리인 특별한 경우에는 상위 디렉터리에서 rename/prename[1]을 사용하여 파일을 해당 상위 디렉터리로 이동할 수 있습니다.
rename -n 's:/:-:g' */file.txt
( 시험 실행의 경우 제거하거나 실제 실행으로 -n
대체 )-v
파일의 깊이가 여러 수준 인 경우 .txt
(또는 깊이를 알 수 없는 경우) globstar 옵션을 사용할 수 있습니다.
shopt -s globstar # makes '**' match any levels of directories
rename -n 's:/:-:g' **/*.txt
[1] 이 명령은 rename
Debian/Ubuntu 및 그 파생물, prename
Redhat/Fedora 및 그 파생물 에 적용됩니다.
답변2
하위 디렉터리가 있고 $insub_FIM_M_1
복사하려는 파일이 file.txt
각 하위 디렉터리에서 호출된다고 가정하면
mkdir -p result || exit 1
for pathname in "$insub_FIM_M_1"/*/file.txt; do
cp "$pathname" "result/$( basename "$( dirname "$pathname" )" )_file.txt"
done
파일은 result
현재 디렉토리 내의 디렉토리에 복사되며, 파일이 위치한 디렉토리에 따라 각 파일의 이름이 변경됩니다.
답변3
cat FIM_1.txt
당신이 우리에게 그것에 대해 말하지 않았기 때문에 당신이 이 파일을 사용하는 이유를 완전히 모르겠습니다 . 이 코드는 폴더 집합의 각 폴더에서 복사되어 file.txt
원래 폴더의 이름을 딴 디렉터리에 배치됩니다.X
cd "$insub_FIM_M_1"
for DIR in *
do
test -d "$DIR" -a -f "$DIR/file.txt" || continue
mv -f "$DIR/file.txt" "/path/to/X/$DIR"
done
답변4
다음 코드를 시도했는데 작동합니다.
#!/bin/bash
insub_FIM_M_1=path to a parent folder conatin all the folders (A,B,C,D,E,F,G,H)
out=path
for i in $(cat $insub_FIM_M_1/FIM_1.txt); do
cp insub_FIM_M_1/file.txt ${path}/${i}.txt
done