Проблема связана с пробелами в именах файлов. Имена файлов разделены пробелами. Когда cp
получает более двух аргументов, последний аргумент должен быть каталогом. Это не так, поэтому он жалуется.
Чтобы удалить строку Edexcel International GCSE Physics
из каждого имени файла и безопасно преобразовать пробелы в символы подчеркивания, используйте (вbash
)
for name in 'Edexcel International GCSE Physics '*.docx; do
newname=${name#Edexcel International GCSE Physics }
newname=${newname// /_}
mv -i "$name" "$newname"
done
Это перебирает все соответствующие файлы в текущем каталоге и создает новое имя в переменной newname
, сначала удаляя известную подстроку с самого начала имени, а затем преобразуя оставшиеся пробелы в символы подчеркивания. Затем старое имя переименовывается в новое имя.
Измените mv
на cp
, если вы действительно хотите создавать копии файлов (, как в вашем коде ).
Тестирование:
$ ls
Edexcel International GCSE Physics Chapter 10 Properties of Waves Learning Plan.docx
Edexcel International GCSE Physics Chapter 11 The Electromagnetic Spectrum Learning Plan.docx
Edexcel International GCSE Physics Chapter 12 Light Waves Learning Plan.docx
(здесь запускается цикл)
$ ls
Chapter_10_Properties_of_Waves_Learning_Plan.docx
Chapter_11_The_Electromagnetic_Spectrum_Learning_Plan.docx
Chapter_12_Light_Waves_Learning_Plan.docx
Вы хотите применить это рекурсивно к нескольким подкаталогам?:
find. -type f -name 'Edexcel International GCSE Physics *.docx' -exec sh -c '
for pathname; do
name=$(basename "$pathname")
newname=${name#Edexcel International GCSE Physics }
newname=${newname// /_}
mv -i "$pathname" "$(dirname "$pathname")/$newname"
done' sh {} +
Связанные:
Возможно, вы захотите поместить двух пользователей в group
и работать с этим. Насколько я понимаю, функция alias
предназначена больше для commands
, а не для users
.