Shell/Perl에서 새로 생성된 디렉터리로 조건부로 파일을 이동하는 방법

Shell/Perl에서 새로 생성된 디렉터리로 조건부로 파일을 이동하는 방법

이것은 음악 파일과 디렉토리의 묶음입니다.

동시에 여러 디렉터리에서 다음 작업을 수행해야 합니다.

  1. 디렉터리에 ".jpg" 파일이 포함된 경우 새 디렉터리 "Covers"를 만들고 파일을 해당 디렉터리로 이동합니다.
  2. 디렉토리에 ".jpg" 파일이 포함되어 있지 않으면 "Covers" 디렉토리를 생성하지 마십시오.
  3. 디렉토리에 이미 "Covers" 디렉토리가 포함된 경우 "Covers" 디렉토리를 생성하지 마십시오.

답변1

존재하다 bash:

#!/bin/bash
shopt -s nullglob
for dir; do
    [[ -d $dir ]] || continue
    jpgs=( "${dir}"/*.jpg )
    if (( "${#jpgs[@]}" )); then
        [[ -d ${dir}/Covers ]] || mkdir "${dir}/Covers"
        # Avoiding race condition by not reusing the jpgs array
        for jpg in "${dir}"/*.jpg; do
            mv "$jpg" "${dir}/Covers"
        done
    fi
done

답변2

저는 아직 초보자이지만 제가 가진 것은 다음과 같습니다.

#!/bin/bash
current_directory=$(pwd)
#echo $current_directory
(find -maxdepth 1 -type d -name '*' ! -name '.*' -printf '%f\n')>filelist
number=$(find -maxdepth 1 -type d -name '*' ! -name '.*' -printf '%f\n' | wc -l)
for iteration in `seq $number`
do
    fname=$(head -1 filelist)
    sed 1d < filelist > filelist2
    mv filelist2 filelist
    cd "$fname"
    if [ -z $(ls | grep -i jpg) ]
    then echo "Doing nothing as there are no JPG files....."
    else
        total=$(ls -l|grep -i jpg | wc -l)
        mkdir -p Covers
        mv *.jpg Covers
        echo "Moved $total JPG Files....."
    fi
    cd "$current_directory"
done  

기본 음악 디렉토리로 이동하여 이 스크립트를 실행하세요.

매개변수를 전달할 필요가 없습니다.

편집 : 예전에는 엉성했습니다. 지금은 더욱 엉성해졌습니다. 그러나 나는 그것이 효과가 있을 것이라고 생각한다.

답변3

#!/bin/bash  

SAVEIFS=$IFS  
IFS="\n\b"  
#-----------------------------------------------------------------------------  

#work in current dir if work path was not provided  
[ $# -eq 0 ] && search_path="." || search_path="$1"  


# files to be moved, more extensions can be added  
wildcard="*[jpg|JPG]"  


move_jpg() {  
    # create "Covers" if it doesn't exist  
    [ -d "$1/Covers" ] && echo -n " ... " || { echo -n " ...create Covers ";   mkdir "$1/Covers" }  

    mv "$1/$wildcard" "$1/Covers/$wildcard"  
    echo "... files moved"  
}  



for d in "$search_path/*/"; do  

    echo -n "testing <$d>   "  

    [ -e "$d/$wildcard" ] && ${move_jpg "$d"} || echo "...Not found <$wildcard>"  

done  



#-----------------------------------------------------------------------------  
IFS=$SAVEIFS  

관련 정보