Programming/Linux

[Linux] 파일목록을 이용하여 한번에 이동시키기

김해김씨99대손 2022. 12. 26. 10:24

약 800여 개의 fastq.gz파일은 4개의 카테고리로 구성되어 있다.

각 파일의 이름이 담긴 목록을 엑셀로 생성 후 이를 이용해 파일을 각 디렉터리에 옮기고자 한다.

 

 

https://stackoverflow.com/questions/45111754/move-multiple-files-from-a-folder-to-list-of-directories-undo-a-move-command

while read line; do
     fileName=$(basename $line)
     dirName=$(dirname $line)
     cp SourceDir/"$fileName" "$dirName"
done < ListOfFile.txt

그러나 문제는 엑셀로 만든 파일이 뒤에 '\r'이 붙어서 이동이 되지 않았다.

또한 위 방법은 file이름과 현재 파일이 위치한 path까지 경로를 만들어야 하므로 좀 더 간단한 방법을 구상해 보자

 

 

1. 먼저 \r을 제거하자

tr -d '\r' < list_of_file.txt >list_of_file2.txt

 

2. 이후 이동시켜 보자 

for file in $(cat ~/Desktop/list_of_file.txt); do mv "$file" ./dir; done

이렇게 간단하게 해결할 수도 있고, 아래처럼 함수를 만들어서 두고두고 쓸 수도 있다.

 

 

+) ChatGPT한테 물어본 함수 

#!/bin/bash

# 스크립트 파일이 위치한 디렉토리 경로
script_dir="$(dirname "$(realpath "$0")")"

# 파일 목록이 들어있는 텍스트 파일 경로
file_list="$script_dir/$1"

# 이동할 폴더 경로
destination_folder="$2"

# 함수 정의
move_files() {
    while IFS= read -r file; do
        if [ -f "$file" ]; then
            mv "$file" "$destination_folder"
            echo "Moved file: $file"
        else
            echo "File not found: $file"
        fi
    done < "$file_list"
}

# 함수 호출
move_files "$file_list" "$destination_folder"

mv_files.sh라는 문서 안에 위의 코드를 넣어보자.

이후 chmod +x mv_files.sh를 적고, 아래와 같이 적용하면 된다.

 

./mv_files.sh "list.txt" "./dir"

만약 옮겨졌다면 Moved file :~ 이 출력된다.

 

 

3. 옮긴 파일의 개수가 맞는지 확인해 보자 

cd dir/
ls -l | grep ^- | wc -l

 


https://stackoverflow.com/questions/800030/remove-carriage-return-in-unix

https://superuser.com/questions/538306/move-a-list-of-filesin-a-text-file-to-a-directory

ChatGPT

 

 

 

반응형