bash - удалить первые 3 символа и последний 1 символ из все mp3 файлы во всех подкаталогах

Я не уверен, что это поможет, но на всякий случай, да, я провел небольшое исследование.

Он может быть реализован как (не применяется в вашей команде)

if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) {
  perror(0);
  exit(1);
}

Но что касается сигнала , он устарел.

Лучше может быть

struct sigaction sa;
sa.sa_handler = SIG_IGN;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
if (sigaction(SIGPIPE, &sa, 0) == -1) {
  perror(0);
  exit(1);
}

Источник и дополнительная информация:
Предотвратить завершение процесса при записи в сломанный канал и
Игнорировать SIGPIPE, не затрагивая другие потоки в процессе

​​

0
27.04.2018, 18:06
3 ответа

Если у вас есть rename(, иногда известный как prename), вы можете сделать это одной командой:

rename -n 's!(.*/)...(.*).(\.mp3)!$1$2$3!' */?????*.mp3

В качестве альтернативы вы можете просмотреть файлы в цикле:

for f in */?????*.mp3
do
    echo mv -v "$f" "$(echo "$f" | sed -r 's!(.*/)...(.*).(\.mp3)!\1\2\3!')"
done

В первую очередь удалите-n(или замените его на -v), чтобы он выполнял работу. Во втором экземпляре удалите первый echo, чтобы изменения вступили в силу.

0
28.01.2020, 04:23

I would not advise just collecting all files that match *.mp3 and then trimming the file names. You MAY want to run this same script AGAIN later (like next week) and it should NOT try to rename the same files a second time, making them even shorter and have naming conflicts.

Your example file names seem to be 001xyz1.mp3 and you want xyz.mp3

     KEEP_DIR=$PWD 
     cd /your/music/base_dir        # sub-dirs holding.mp3

     RCOUNT=0 ; SKIP=0 ; FCC=0


 for FFF in */001???1.mp3    
     do
     LOC="$(dirname $FFF)"   
     BAS="$(basename $FFF)"
     TRIM1="${BAS#1.mp3}"     #could use ${BAS:4:3}
     NEWF="$LOC/${TRIM1%001}.mp3"
     if [ -e "$NEWF" ] ; then
        echo "#-- File $NEWF already exists, not renaming $FFF"
        SKIP=$((SKIP+1))
     else
        mv $FFF $NEWF
        MCOUNT=$((MCOUNT+1))
     fi
     FCC=$((FCC+1))
 done

 echo "Renamed $MCOUNT mp3 files, of $FCC found. (Skipped $SKIP)"
 cd $KEEP_DIR

 #--[eof]
0
28.01.2020, 04:23

Вы можете использовать sedдля создания одной командной строки mvдля каждого mp3 с базовым именем из 7 символов:

$ find. -name "???????.mp3" | sed 's/\(.*\)\(...\)\(...\)\(.\)\(\.mp3\)/mv \1\2\3\4\5 \1\3\5/'

После просмотра вывода вы можете перенаправить его в файл и выполнить.

0
28.01.2020, 04:23

Теги

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