![Переименовать файл (префикс), указав полный путь?](https://rvso.com/image/89180/%D0%9F%D0%B5%D1%80%D0%B5%D0%B8%D0%BC%D0%B5%D0%BD%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%84%D0%B0%D0%B9%D0%BB%20(%D0%BF%D1%80%D0%B5%D1%84%D0%B8%D0%BA%D1%81)%2C%20%D1%83%D0%BA%D0%B0%D0%B7%D0%B0%D0%B2%20%D0%BF%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9%20%D0%BF%D1%83%D1%82%D1%8C%3F.png)
Я бы добавил префикс к своим файлам ( .dat
) следующим образом:
CLY_BIZ_COM_PERD.dat -> 20160622CLY_BIZ_COM_PERD.dat
Я попробовал следующее:
key=`date "+%Y%m%d"`
for i in $(ls /Path/*.dat); do mv ${i} "${key}${i}" ;done
Но эта командасуффиксмои файлы и не префиксить его. Как я могу это сделать?
решение1
Два изменения в вашем текущем сценарии:
непарсинг ls;вместо этого полагайтесьна подстановке оболочки
поскольку файлы находятся в подкаталоге, либо
cd
сначала запустите цикл, либо используйтеbasename
иdirname
для извлечения частей каталога и имени файла перед добавлением префикса.
(Примечание: я также изменил ваш «/Path» на «./Path», поскольку не хотел создавать корневой каталог /Path. Однако применяются те же принципы.
Чтобы настроить несколько образцов файлов:
mkdir Path && cd Path
touch CLY_BIZ_COM_PERD.dat jeff.dat a.dat c\ d.dat
cd ..
Вот пример:
for f in ./Path/*.dat
do
printf "mv '%s' '%s'\n" "$f" "$(dirname "$f")/${key}$(basename "$f")"
done
Результат пробного прогона:
mv './Path/a.dat' './Path/20160622a.dat'
mv './Path/c d.dat' './Path/20160622c d.dat'
mv './Path/CLY_BIZ_COM_PERD.dat' './Path/20160622CLY_BIZ_COM_PERD.dat'
mv './Path/jeff.dat' './Path/20160622jeff.dat'
Как только вы будете удовлетворены, сделайте это по-настоящему:
for f in ./Path/*.dat
do
mv "$f" "$(dirname "$f")/${key}$(basename "$f")"
done
... и результат:
$ ls -1 Path
20160622a.dat
20160622c d.dat
20160622CLY_BIZ_COM_PERD.dat
20160622jeff.dat