Сценарий для перемещения одного типа файла и создания подпапки, если она существует?


Если вы загружаете программу с этого URL GitHub, вы должны заметить, что в комплект поставки входит Makefile . Я скачаю весь каталог проекта и запущу команду make. После этого, скорее всего, у вас будут сгенерированы файлы .ko
  • , это модули (драйверы) ядра Linux.


    Снова используя

  • Makefile
  • должна быть включена цель под названием
  • install
  • . Вы можете запустить его таким образом,
  • make install
  • . При этом файлы
  • .ko
  • должны быть размещены в соответствующих местах.

    После "установки" вы можете загрузить и выгрузить их следующим образом:

  • 1
    31.05.2015, 02:20
    3 ответа

    Используйте это:

    #!/bin/bash
    
    find /files/music/artist -type f -name '*.flac' | while IFS= read -r file; do
        dir="$(dirname "$file")"
        file="$(basename "$file")"
        shopt -s nullglob
        mp3s=( "$dir"/*.mp3 )
    
        if ! [[ ${#mp3s[@]} -eq 0 ]]; then
            ext="${file##*.}"
            mkdir -p "$dir/$ext" && mv -i "$dir/$file" "$dir/$ext"
        fi
    done
    
    • Найти найдут файлы, имеющие расширение .flac в указанном каталоге и всех его подкаталах.

    • DIR будет содержать названия каталогов файлов, а файл будет иметь имя файла

    • , то мы проверили, есть ли этот каталог .mp3 файл файла. Если нет, то файлы останутся в том, что он находится в каталоге

    • , если в этом каталоге есть какой-либо файл .mp3 , то каталог, имеющий имя расширения ( FLAC ) будет создан и .flac файлы будут перемещены в этот каталог.

    2
    27.01.2020, 23:20

    У вас есть несколько сложных требований, но этот скрипт может помочь.

    #!/bin/bash
    
    run() {
            if $DRYRUN; then
                    echo -n +
                    printf " '%s'" "$@"
                    echo
            else
                    "$@"
            fi
    }
    
    DRYRUN=false
    if test x"$1" = x-d; then
            DRYRUN=true
            shift
    fi
    
    for dir in "$@"; do 
            find "$dir" -type d |
            while read subdir; do
                    if ls "$subdir"/*.flac >/dev/null 2>&1; then
                            if ls "$subdir"/*.mp3 >/dev/null 2>&1; then
                                    run mkdir -p "$subdir"/flac
                                    run mv "$subdir"/*.flac "$subdir"/flac
                            fi
                    fi
            done
    done
    

    Вы можете увидеть, что будет происходить, указав -D . Убедитесь, что дважды проверьте его перед фактическими ходами.

    $ ./script.sh -d /files/music
    + 'mkdir' '-p' '/files/music/artist/album2/flac'
    + 'mv' '/files/music/artist/album2/01-yet another.flac' '/files/music/artist/album2/flac'
    + 'mkdir' '-p' '/files/music/artist/album1/flac'
    + 'mv' '/files/music/artist/album1/01-song 1.flac' '/files/music/artist/album1/02-another song.flac' '/files/music/artist/album1/flac'
    
    0
    27.01.2020, 23:20

    Простая версия, которая всегда создает подкаталоги flac и mp3 (если они не пусто), используя команду find для выполнения сценария для создания подкаталога, если необходимо, и перемещения файла туда:

    find . -name '*.mp3' -o -name '*.flac' -exec sh -c 'mkdir -p "${0%/*}/${0##*.}" && mv "$0" "${0%/*}/${0##*.}"' {} \;
    

    Для каждого файла, для которого выполняется фрагмент оболочки, $ 0 - это путь к файлу, $ {0% / *} - это часть каталога, а $ {0 ## *.} - это расширение.

    В качестве альтернативы, в bash (или ksh93 с set -o globstar вместо shopt -s globstar extglob или в zsh без setopt ksh_glob вместо), используя шаблон ** :

    shopt -s globstar extglob
    for x in **/*.@(mp3|flac); do
      mkdir -p "${x%/*}/${x##*.}" && mv "$x" "${x%/*}/${x##*.}"
    done
    

    Теперь давайте создадим версию, которая не создает подкаталог, если все файлы имеют одинаковое расширение. Здесь проще рекурсировать по каталогам. Это для bash (его можно адаптировать к ksh93 или zsh). В каждом каталоге сценарий собирает список всех файлов (кроме . и ..), всех файлов .flac и всех файлов .mp3 . в массивах. Если есть хотя бы один файл flac и хотя бы один файл не-flac, переместите файлы flac в подкаталог flac`. То же самое для файлов mp3.

    shopt -s globstar nullglob; GLOBIGNORE=.:..
    start_wd=$PWD
    for dir in "$PWD"/**/*/; do
      cd "$dir"
      files=(*)
      flac_files=(*.flac)
      mp3_files=(*.mp3)
      if ((${#flac_files[@]} > 0 && ${#flac_files[@]} < ${#files[@]})); then
        mkdir flac && mv "${flac_files[@]}" flac/
      fi
      if ((${#mp3_files[@]} > 0 && ${#mp3_files[@]} < ${#files[@]})); then
        mkdir mp3 && mv "${mp3_files[@]}" mp3/
      fi
    done
    cd "$start_wd"
    
    2
    27.01.2020, 23:20

    Теги

    Похожие вопросы