폴더 이름으로 파일 이름 바꾸기

폴더 이름으로 파일 이름 바꾸기

일종의 폴더(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] 이 명령은 renameDebian/Ubuntu 및 그 파생물, prenameRedhat/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

관련 정보