Bash скрипт на копирование файлов определённого расширения и смена верхнего регистра на нижний

Bash скрипт на копирование файлов определённого расширения из директории(включая подпапки) без сохранения структуры Существует Ubuntu18, на который сохраняется файлы формата Axxx.xlsx Я написал след скрипт

find -name «*.xlsx» | tr [:upper:] [:lower:] | cp /home/vskibenko/tmp/.

Но он отрабатывается не совсем четко

Суть скрипта в след "Копирование файлов из папки и ее подпапок в другую директорию, с изменением названия на нижний регистр"


Ответы (2 шт):

Автор решения: Pak Uula

Пример: копирование txt файлов из текущей папки в папку dst/

ls *.txt | sed -e 's#\(.*\)#cp "\1" "dst/\L\1";#' | bash -s

sed формирует на лету скрипт, bash -s его читает из стандартного входа и выполняет.

Скрипт для моей тестовой папки получился вот такой:

cp "A.txt" "dst/a.txt";
cp "b.txt" "dst/b.txt";
cp "c D.txt" "dst/c d.txt";

Имена файлов взяты в кавычки на случай пробелов в именах.

→ Ссылка
Автор решения: Fat-Zer

Я бы сделал как-то так:

find -name "*.xlsx" | while read f; do 
  fn="$(basename "$f")"; 
  cp "${f}" "/home/vskibenko/tmp/${fn,,}";
done

Замечания:

  • Такой вариант не будет работать, если в именах файлов есть переводы строк.
  • Расширение переменной с переводом в нижний регистр (${fn,,}) — это bash'изм и может не работать в других POSIX-совместимых оболочках, например, dash.
  • Выражение записано в несколько строк для удобство чтения, в таком виде его можно применять и в одну строку.
→ Ссылка