. Я скачаю весь каталог проекта и запущу команду
make. После этого, скорее всего, у вас будут сгенерированы файлы
.koСнова используя
После "установки" вы можете загрузить и выгрузить их следующим образом:
Используйте это:
#!/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
файлы будут перемещены в этот каталог.
У вас есть несколько сложных требований, но этот скрипт может помочь.
#!/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'
Простая версия, которая всегда создает подкаталоги 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"