Похоже, что можно использовать x в пределах размера изображения в имени, так что я бы написал это примерно так. ищем любой файл, в имени которого нет x, используя подстроку, затем копируем их все, оставляя остальные в покое.
#!/bin/bash
typeset -i count
let count=0
MAXF="$(find /path -type f -name "*.*" | wc -l)"
find /path -type f -name "*.*" | while [[ $count -ne $MAXF ]] ;
do read FILENAME;
name=${FILENAME##*/}
substring="x"
if [[ "$name" != *"$substring"* ]] ; then
cp -v "$FILENAME" /path/newname
((count++))
fi
((count++))
done
Я не проверял это... это не на словах, но это позволит завершить то, что вы уже задумали сделать с вашим маленьким проектом.
для этой части вашего вопроса "Когда эти картинки копируются, можно ли скопировать структуру папок?" - да, но это может стать сложным сценарием, если вы копируете только некоторые файлы, а не все в подобную структуру, но в другой родительский каталог.
потому что он должен быть на другом разделе или в другом имени родительского каталога, чтобы иметь ту же структуру подкаталогов. вот фрагмент одного из моих скриптов, в котором я делаю что-то похожее.
Надеюсь, это поможет вам понять, как использовать переменные, командную строку и логику, чтобы добиться результата. ... непристойный код перед этим должен быть на месте, чтобы остальная часть этого кода работала правильно. Первые три утверждения устанавливают ваши пути к директориям для использования srtipt_dir могут быть не очень нужны в вашем скрипте, все зависит от того, как и что вы делаете в скрипте, чтобы сделать это необходимым элементом. move_to можно заменить на copy_to.
это два цикла, которые я использую, работая с одним "базовым" диром за раз, затем просматривая каждый файл в этом дире, прежде чем перейти к другому "базовому" диру в дереве и его поддиректориям. Проверяю в другой ветви структуры дерева, есть ли там уже такое же имя dir, если нет, то перемещаю его в эту новую ветвь дерева, если да, то копирую содержимое ветви в эту другую ветвь структуры дерева, затем удаляю все, что осталось в старой ветви дерева (структура dir).
часто использую echo, чтобы сначала проверить свою работу, прежде чем приступать к ней
#!/bin/bash
script_dir="path"
files_dir="path"
move_to="path/dirName"
........
# if this is say /home/picures/myFotos
# then this statment will check the last dir name is there
# if it is not there. It will then create it.
# you will have to then take off of the old dir structor and
# recreate it off of this statement
if [[ ! -d "$move_to" ]] ; then
mkdir -v "$move_to"
fi
# set for 5th Directory to be Artist Dir
echo;echo
OldDirName=${DIRNAME#*/*/*/*/*/}
echo "1 - OldDirName $OldDirName"
echo
OldDirName=${OldDirName//\/*}
echo "2 - OldDirName $OldDirName"
echo
echo;echo "OldDirName : $OldDirName"
echo
# if no artist on file tag present then keep orginal DirName
if [ ! -z "$changeDirName" ] ; then
newDirName="$changeDirName"
else
#if no Artist MetaData
newDirName="$OldDirName"
fi
########### CHANGE NAME OF PARENT DIR WHERE IT IS AT FIRST
echo;echo "Old Dir Name != newDirName " echo "this is MP3Count - "$MP3Count""
echo;echo "[[ "$OldDirName" != "$newDirName" ]]"
if [[ "$OldDirName" != "$newDirName" ]] ; then
oldDirPathNewName=""$working_dir"/"$newDirName""
Dir="$newDirName"
echo;echo "oldDirPathNewName "$oldDirPathNewName""
echo ""$OldDirName" not = to "$newDirName""
#change name of dir to artist/band name
echo "mv "$OldDirName" to "$oldDirPathNewName""
#change old dir name to new dir name
#mv -v "$working_dir"/"$OldDirName" "$oldDirPathNewName"
mv -v "$working_dir"/"$OldDirName" "$oldDirPathNewName"
echo
else
Dir="$OldDirName"
fi
from=""$working_dir"/"$Dir""
to=""$move_to"/"$Dir""
#check if the desanation directory is already there if not move it or
# copy it into it then remove left overs
if [[ ! -d "$to" ]] ; then
#move_to"/"$Dir" ]] ; then
echo "inside ck if move to parent / artist to dir is there"
echo
echo ""$move_to"/"$Dir" is not there moving "$Dir""
echo
#then move the new dir name to a different
# place for safe keeping
echo
echo;echo "just befor move "
echo
echo
echo "$from -> $to"
mv -vf "$from" "$to"
echo
echo "DirIsaidtoDo Left : $DirIsaidtoDo"
echo
else
echo ""$move_to"/"$stringNewDir" is there moving within it into"
echo
echo "$move_to"/"$stringNewDir"
echo
echo
cp -Rv "${from}"/* "$to"
echo
rm -rv "$from"
echo
echo "DirIsaidtoDo Left : $DirIsaidtoDo"
echo
fi
fi
echo "********** NEXT FILE ***********************"
done
let DirCountDn++
echo "Dir Count Dn "$DirCountDn""
echo "******************************************"
let AmountDirs--
echo "Amount Dirs to go $AmountDirs"
echo
let DirIsaidtoDo--
echo;echo;echo
done #FOR DIR Names
для создания более одного dir в порядке создания пути, это создает все имена dirNames, устанавливая родительский dir и его subDir тоже
mkdir -pv path/dirName/DirName/DirName
Да, disk sdf сообщает об ошибках в нескольких блоках. Замените его при первой же возможности. Возможно, вы также захотите использовать smartctl
для получения статистики о сбоях диска
smartctl -a /dev/sdf
Подробнее см.https://linux.die.net/man/8/smartctlи https://www.thomas-krenn.com/en/wiki/Analyzing_a_Faulty_Hard_Disk_using_Smartctl
.