이 기능을 검색해 보니 답변이 많이 있지만 나에게 맞는 기능을 찾을 수 없습니다.
약 30,000개의 파일이 있는 폴더가 있고 이러한 파일을 다른 폴더로 이동하려면 터미널 명령이나 bash 스크립트가 필요합니다. 각 폴더에는 약 3000개의 파일이 있습니다. 일부 파일 이름에는 밑줄, 공백 및 하이픈이 포함되어 있으므로 이 명령을 사용하면 밑줄, 공백 및 하이픈 없이 해당 파일과 파일을 이동할 수 있습니다. 파일은 .jpg이지만 나중에 다른 형식과 개수로 사용해야 할 경우를 대비해 모든 파일 유형과 파일 개수에 맞게 사용자 정의할 수 있는 명령을 원합니다.
고쳐 쓰다:
필요한 작업을 수행하는 bash 스크립트를 찾았습니다. 폴더의 파일을 하위 폴더로 이동합니다. 모든 유형의 파일에서 작동합니다. 숫자 "3001"은 각 하위 폴더로 이동하려는 파일 수를 나타냅니다. 이 번호는 변경될 수 있습니다. 따라서 20,000개의 파일이 있는 폴더가 있고 20,000개의 파일을 500개의 배치로 분할하여 하위 폴더로 이동하려면 "3001"을 "500"으로 바꾸십시오. 특정 파일 형식만 이동하도록 스크립트를 수정할 수도 있습니다. 예를 들어 .jpg 파일만 이동하려면 "for file in *"를 "for jpg_file in *.jpg"로 변경합니다. 또한 "$file"을 "$jpg_file"로 변경합니다.
#!/bin/bash
c=1; d=1; mkdir -p dir_${d}
for file in *
do
if [ $c -eq 3001 ]
then
d=$(( d + 1 )); c=0; mkdir -p dir_${d}
fi
mv "$file" dir_${d}/
c=$(( c + 1 ))
done
답변1
모든 스크립트를 시도했지만 어떤 이유로 작동하지 않거나 부분적으로만 작동했습니다. 나이 bash 스크립트를 찾았습니다.그리고 .xml 파일 대신 .jpg 파일을 찾도록 조정합니다.
#!/bin/bash
c=1; d=1; mkdir -p dir_${d}
for jpg_file in *.jpg
do
if [ $c -eq 501 ]
then
d=$(( d + 1 )); c=0; mkdir -p dir_${d}
fi
mv "$jpg_file" dir_${d}/
c=$(( c + 1 ))
done
그것은 잘 작동하고 빠르게 작동합니다. 이제 내 유일한 문제는 ".jpg"뿐만 아니라 모든 파일을 폴더로 이동하는 것입니다. 또한 대소문자를 구분하며 ".JPG"는 이동되지 않습니다. 파일이나 적어도 이미지 파일을 이동하기 위해 조정하는 방법에 대한 아이디어가 있습니까?
답변2
어때요?
for letter in {A..Z}; do
dir=/path/to/sorted/directories/$letter
mkdir $dir
mv "${letter}*.jpg" $dir/
done
물론, 소문자를 사용하는 동일한 루프가 있습니다 {a..z}
. 단, 이 경우에는 별도의 소문자 디렉토리를 생성하고 싶지 않습니다. 그러면 움직이는 선은 다음과 같습니다.
mv "${letter}*.jpg" ${dir^^}/
변수 생성을 위한 대문자 버전에는 ${var^^}
Bash 4.0이 필요합니다.
편집: 누락된 따옴표를 수정했습니다. 이 점을 지적해 주신 G-man에게 감사드립니다.
답변3
내 생각에는 다음과 같다.
#!/bin/bash
shopt -s nullglob
for i in <directory>; do
mv *.jpg "$dir"
done
이렇게 하면 모든 jpeg가 설정해야 하는 $dir로 이동하거나 디렉터리 이름이 있는 배열을 만들어야 합니다. *.jpg
다른 형식으로 전환하여 이 코드를 쉽게 사용자 정의할 수 있습니다 . 필요에 맞게 사용자 정의하려면 이 코드 조각을 조정해야 합니다.
업데이트 이 기능을 만들려면 다음을 시도해 보세요.
#!/bin/bash
echo "Enter Directory: ";
read dir
mkdir $dir
moveFiles(){
arg1=$1
counter=0;
while[$counter -ne 3000]; do
mv <source> *.jpg "$dir"
counter++;
if[$counter -e 3000];
then
exit;
fi
done
}
moveFiles "$dir"
exit
다시 말하지만, 이 코드를 조정해야 할 수도 있습니다. 이것은 단지 예일 뿐입니다.
답변4
당신이 가지고 있다고 가정디렉토리당신은 움직이고 싶어파일 출처:.
당신은 그것을 사용할 수 있습니다 :
$ mv <source folder/*.jpg <destination folder/>
편집하다:
다음 스크립트는 정의된 검색 기준과 일치하는 모든 파일을 찾은 file_screen
다음 while
루프를 실행하여 선택한 파일을 이동합니다.
모듈로 기준에 따라 새 디렉토리가 생성됩니다. loop iteration mod files_in_each
.mod가 0을 반환하면 새 디렉토리가 생성되고 파일이 해당 디렉토리로 이동됩니다.
작동 중에 조정해야 하는 매개변수:
files_in_each=3000 # controls how many files are placed in each directory
directory_to_move="/home/shadowe/test1/test2" # where are the files located
file_screen="jpg" # only move files that match this criteria
필요에 따라 조정하십시오.
#!/bin/bash
# basic definitions and calculations
files_in_each=3000
directory_to_move="/home/shadowe/test1/test2"
file_screen="jpg"
folders_created=0
i=0
# while loop through all of the files that match screening criteria
find $directory_to_move/* -maxdepth 1 -type f -name "*${file_screen}" -print0 | sort -n | while IFS= read -r -d '' file;
do
# modulo control for creating directories every files in each completion
create_dir=`expr $i % $files_in_each`
if [ $create_dir -eq "0" ]
then
new_folder=folder$folders_created
mkdir $new_folder
echo "created new folder: " $new_folder
folders_created=$[$folders_created+1]
fi
mv "$file" $new_folder
i=$[$i+1]
done
작은 샘플을 실행한 후의 결과:
$ ls test2/
not a picture.txt
$ ls folder0/
one.jpg one*two.jpg picture 1.jpg two-one.jpg
one-two.jpg picture 1111.jpg picture *.jpg two three.jpg
대규모 샘플 결과:
$ ls folder0 | wc -l
3000
$ ls folder1 | wc -l
2008
$ ls test2 | wc -l
7501
$ ls test2/ | grep "jpg"
$
테스트 파일을 생성하는 스크립트:
#!/bin/bash
mkdir test2
touch test2/one.jpg
touch test2/'one-two.jpg'
touch test2/'one*two.jpg'
touch test2/'two-one.jpg'
touch test2/'two three.jpg'
touch test2/'picture 1.jpg'
touch test2/'picture *.jpg'
touch test2/'picture 1111.jpg'
touch test2/'not a picture.txt'
#for large test sample uncomment below
#for i in `seq 1 7500`; do touch test2/test$i.txt; done
#for j in `seq 1 5000`; do touch test2/picture$j.jpg; done