약 800여 개의 fastq.gz파일은 4개의 카테고리로 구성되어 있다.
각 파일의 이름이 담긴 목록을 엑셀로 생성 후 이를 이용해 파일을 각 디렉터리에 옮기고자 한다.
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
반응형