Щоб перетворити цикл на всі файли в поточному каталозі, що містять принаймні один :символ у своєму імені і закінчується на .txt, і змінити :символи на _оболонки ksh93, zsh, bash, mksh (або останні версії zasedbox sh), ви можете використання
for name in ./*:*.txt; do
newname=${name//:/_}
mv -i "$name" "$newname"
done
або, коротше,
for name in ./*:*.txt; do
mv -i "$name" "${name//:/_}"
done
Підстановка параметра ${name//:/_}змінила б усе :в _будь-якому місці значення $name(оператор ksh93 також підтримується згаданими вище оболонками).
Файл mv -iбуде перейменований, але попросить підтвердження, якщо нове ім'я вже прийняте.
Ім'я файлу, яке ви показуєте як приклад, буде змінено на ee_Sun_Aug_11_22_20_27_GMT-8_2019.txt.
Ваша команда
cp /var/log/ee.txt ee_`date`.txt
не працює, оскільки dateвиводить рядок з пробілами в ньому. Пробіли могли б cpподумати, що ви хочете скопіювати кілька файлів у каталог. Отже, помилка "не каталог".
Наступне працювало б краще:
cp /var/log/ee.txt "ee_$(date).txt"
Це працює краще, не тому, що я змінив ваші підставки, $(...)а тому, що я двічі цитував нову назву.
Це створило б файл ee_Sun Aug 11 16:57:37 CEST 2019.txt(або щось подібне).
Щоб отримати акуратне ім'я файлу, ви можете dateтрохи детальніше вказати вихідний формат :
cp ee.txt "ee_$(date +"%F_%H-%M-%S").txt"
Рядок формату %F_%H-%M-%Sбуде описаний у strftime(3)посібнику на вашій системі ( man 3 strftime) або в посібнику для dateкоманди, і ви отримаєте назву файлу типу ee_2019-08-11_16-59-55.txt. Якщо ваша dateне підтримує %Fдирективу, її можна замінити на %Y-%m-%d.
Крім того,
cp ee.txt "$(date +"ee_%F_%H-%M-%S.txt")"
(дозволяючи dateкомандному формату виконати більшу частину роботи зі створення нового імені файлу)