Замените имя папки с помощью содержавшего имени файла

У меня есть приблизительно тысяча папок, имеющих случайные имена. Каждая папка имеет по крайней мере один файл с avi, mkv, srt или mp4 расширением.
Я намереваюсь заменить случайное сгенерированное имя папки первым именем файла (без расширения) содержавший на нем. Название использования файлов для включения () - и другие странные символы. Сценарий должен, по-моему:

  1. Войдите в папку
  2. Получите имя без расширения
  3. Выйдите из папки
  4. Переименуйте папку с помощью нового имени
  5. Рекурсивное перемещение папки, поскольку это может содержать другую подпапку

5-й шаг может быть переопределением, все же.
Поскольку я - компьютерный фанат в программировании удара, я ценил бы руку. Кто-либо может помочь?

2
задан 3 April 2020 в 22:39

3 ответа

Данный

$ tree
.
├── eYRlzR8Ibk
│  ├── Awnluslskl
│  │  └── ö, û, accnts.avi
│  ├── baz
│  └── xyz.mp4
└── wHKEWxFgIt
    └── foo bar.srt

3 directories, 4 files

затем

$ find . -mindepth 1 -depth -type d -execdir sh -c '
  for d; do
    set -- "$d"/*.*
    [ -e "$1" ] || continue
    f="${1##*/}"
    mv -n -- "$d" "${f%.*}"
  done
' sh {} +

получающийся в

$ tree
.
├── foo bar
│  └── foo bar.srt
└── xyz
    ├── baz
    ├── ö, û, accnts
    │  └── ö, û, accnts.avi
    └── xyz.mp4

3 directories, 4 files
2
ответ дан 7 April 2020 в 23:20

Сценарий Скопировать/вставить сценарий в Вашем текстовом редакторе
Замена ~/test/testfolders3 в sourcedir переменная Вашим именем каталога, которое содержит все каталоги с файлами
Попробуйте его без mv $oldname $newname в первый раз, который будет видеть, что должно произойти.
После редактирования Вас мог просто скопировать его с Вашего текстового редактора и мимо него в окне терминала.

sourcedir=~/test/testfolders3
cd $sourcedir
files=$(find . -type f)
for f in $files
  do
    echo -e "0:Not modified file name:\t $f"
    bname=$(basename $f)                             # Get file's name without path to it
    filewe=$(echo $bname | sed 's/\.[^.]*$//')       # Get file's name without extension
    echo -e "1:Filename without extension:\t $filewe"
    dir=$(dirname $f)                                # Get directory name where file is located
    echo -e "2:Parent file's directory:\t $dir"
    parfold=$(echo $(dirname $dir) | sed 's/.\///')  # Get file's parent directory's parent directory name with stripped `./` preffix
    echo -e "3:Parent-parent stripped dir:\t $parfold"
    olddir=$(echo $dir | sed 's@.*/@@')              # Get file's parent directory name without path to it (everything before the last `/` slash is stripped)
    oldname=$sourcedir/$parfold/$olddir              # Get current file's parent directory name with full path
    echo -e "4:Old folder name:\t\t $oldname"; 
    newname=$sourcedir/$parfold/$filewe              # Set new file's parrent directory name with full path
    echo -e "5:New folder name:\t\t $newname"
    mv $oldname $newname                             # Renames folders
  done
find $sourcedir -type f                              # Shows result

Извините, если это не полностью оптимизировано. Я не программист. Это - только компиляция различных ответов, которые я нашел для записи этого. Потребовалось много времени, из-за я часто не делаю этого.

Это не проверяет теперь, существует ли каталог. Так будучи переименованным однажды именем первого перемещенного файла это просто бросит сообщение как это:

mv: cannot stat '/home/user/test/testfolders3/folders/lkjskd': No such file or directory

Первый перемещенный файл не означает первое в алфавитном порядке.

Вот результат find $sourcedir -type f выполнение команды:

/home/user/test/testfolders3/folders3/file3/file3.mp4
/home/user/test/testfolders3/folders3/file1/file1.avi
/home/user/test/testfolders3/folders3/file2/file2.mkv
/home/user/test/testfolders3/folders3/folders/file3/file3.mp4
/home/user/test/testfolders3/folders3/folders/file1/file1.avi
/home/user/test/testfolders3/folders3/folders/file2/file2.mkv
/home/user/test/testfolders3/folders2/soft/soft.ware
/home/user/test/testfolders3/folders2/soft/file1.avi
/home/user/test/testfolders3/folders2/inter/inter.pol
/home/user/test/testfolders3/folders2/inter/file3.mp4
/home/user/test/testfolders3/folders2/file2/file2.mkv
/home/user/test/testfolders3/folders2/file2/ser.seg
/home/user/test/testfolders3/folders2/folders/file3/file3.mp4
/home/user/test/testfolders3/folders2/folders/file1/file1.avi
/home/user/test/testfolders3/folders2/folders/file2/file2.mkv
/home/user/test/testfolders3/folders/kata/kata.ptx
/home/user/test/testfolders3/folders/kata/file1.avi
/home/user/test/testfolders3/folders/sinaps/sinaps.rtf
/home/user/test/testfolders3/folders/sinaps/file3.mp4
/home/user/test/testfolders3/folders/file2/file2.mkv
/home/user/test/testfolders3/folders/file2/tema.txt
/home/user/test/testfolders3/folders/file2/fan.in

Имена предыдущих папок:

/home/user/test/testfolders3/folders3/kjakd/file2.mkv
/home/user/test/testfolders3/folders3/jafklsjdkl/file1.avi
/home/user/test/testfolders3/folders3/folders/kjakd/file2.mkv
/home/user/test/testfolders3/folders3/folders/jafklsjdkl/file1.avi
/home/user/test/testfolders3/folders3/folders/lkjskd/file3.mp4
/home/user/test/testfolders3/folders3/lkjskd/file3.mp4
/home/user/test/testfolders3/folders2/kjakd/file2.mkv
/home/user/test/testfolders3/folders2/kjakd/ser.seg
/home/user/test/testfolders3/folders2/jafklsjdkl/soft.ware
/home/user/test/testfolders3/folders2/jafklsjdkl/file1.avi
/home/user/test/testfolders3/folders2/folders/kjakd/file2.mkv
/home/user/test/testfolders3/folders2/folders/jafklsjdkl/file1.avi
/home/user/test/testfolders3/folders2/folders/lkjskd/file3.mp4
/home/user/test/testfolders3/folders2/lkjskd/inter.pol
/home/user/test/testfolders3/folders2/lkjskd/file3.mp4
/home/user/test/testfolders3/folders/kjakd/file2.mkv
/home/user/test/testfolders3/folders/kjakd/tema.txt
/home/user/test/testfolders3/folders/kjakd/fan.in
/home/user/test/testfolders3/folders/jafklsjdkl/kata.ptx
/home/user/test/testfolders3/folders/jafklsjdkl/file1.avi
/home/user/test/testfolders3/folders/lkjskd/sinaps.rtf
/home/user/test/testfolders3/folders/lkjskd/file3.mp4
0
ответ дан 7 April 2020 в 23:20

Решение, предложенное Сталелитейщиком (см. выше), работало отлично, быстро и гладкий. Очень чистый и простой код. Вы парни невероятны. Спасибо за внимание и посвящение.С уважением.

0
ответ дан 7 April 2020 в 23:20

Другие вопросы по тегам:

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