У меня есть приблизительно тысяча папок, имеющих случайные имена. Каждая папка имеет по крайней мере один файл с avi, mkv, srt или mp4 расширением.
Я намереваюсь заменить случайное сгенерированное имя папки первым именем файла (без расширения) содержавший на нем. Название использования файлов для включения () - и другие странные символы. Сценарий должен, по-моему:
5-й шаг может быть переопределением, все же.
Поскольку я - компьютерный фанат в программировании удара, я ценил бы руку. Кто-либо может помочь?
Данный
$ 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
Сценарий Скопировать/вставить сценарий в Вашем текстовом редакторе
Замена ~/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
Решение, предложенное Сталелитейщиком (см. выше), работало отлично, быстро и гладкий. Очень чистый и простой код. Вы парни невероятны. Спасибо за внимание и посвящение.С уважением.