Щоб перетворити цикл на всі файли в поточному каталозі, що містять принаймні один :
символ у своєму імені і закінчується на .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
командному формату виконати більшу частину роботи зі створення нового імені файлу)