bash удаление части имени файла
у меня есть следующие файлы в следующем формате:
$ ls CombinedReports_LLL-*'('*.csv
CombinedReports_LLL-20140211144020(Untitled_1).csv
CombinedReports_LLL-20140211144020(Untitled_11).csv
CombinedReports_LLL-20140211144020(Untitled_110).csv
CombinedReports_LLL-20140211144020(Untitled_111).csv
CombinedReports_LLL-20140211144020(Untitled_12).csv
CombinedReports_LLL-20140211144020(Untitled_13).csv
CombinedReports_LLL-20140211144020(Untitled_14).csv
CombinedReports_LLL-20140211144020(Untitled_15).csv
CombinedReports_LLL-20140211144020(Untitled_16).csv
CombinedReports_LLL-20140211144020(Untitled_17).csv
CombinedReports_LLL-20140211144020(Untitled_18).csv
CombinedReports_LLL-20140211144020(Untitled_19).csv
Я хотел бы удалить эту часть:20140211144020
(это метка времени, когда отчеты были запущены, поэтому это будет отличаться)
и в конечном итоге с чем-то вроде:
CombinedReports_LLL-(Untitled_1).csv
CombinedReports_LLL-(Untitled_11).csv
CombinedReports_LLL-(Untitled_110).csv
CombinedReports_LLL-(Untitled_111).csv
CombinedReports_LLL-(Untitled_12).csv
CombinedReports_LLL-(Untitled_13).csv
CombinedReports_LLL-(Untitled_14).csv
CombinedReports_LLL-(Untitled_15).csv
CombinedReports_LLL-(Untitled_16).csv
CombinedReports_LLL-(Untitled_17).csv
CombinedReports_LLL-(Untitled_18).csv
CombinedReports_LLL-(Untitled_19).csv
Я думал просто по линиям mv команда, может быть, что-то вроде этого:
$ ls CombinedReports_LLL-*'('*.csv
но, возможно,sed команда или другое было бы лучше
5 ответов
rename
является частью . Он переименовывает файлы в соответствии с регулярными выражениями perl-стиля. Чтобы удалить даты из имен файлов:
rename 's/[0-9]{14}//' CombinedReports_LLL-*.csv
если rename
отсутствует, sed
+shell
можно использовать в:
for fname in Combined*.csv ; do mv "$fname" "$(echo "$fname" | sed -r 's/[0-9]{14}//')" ; done
вышеуказанные циклы над каждым из ваших файлов. Для каждого файла, он выполняет : mv "$fname" "$(echo "$fname" | sed -r 's/[0-9]{14}//')"
где, в таком случае, sed
может использовать то же регулярное выражение, что и выше. s/[0-9]{14}//
говорит sed
искать 14 цифр подряд и заменять их пустой строкой.
без использования других инструментов, таких как rename
или sed
и строго придерживаться :
for f in CombinedReports_LLL-*.csv
do
newName=${f/LLL-*\(/LLL-(}
mv -i "$f" "$newName"
done
можно использовать rename
утилита для этого. Он использует синтаксис, похожий на sed, для изменения имен файлов. В следующем примере (на man-странице переименование) показано, как удалить трейлинг.расширение bak' из списка резервных копий файлов в локальном каталоге:
rename 's/\.bak$//' *.bak
for f in CombinedReports_LLL-* ; do
b=${f:0:20}${f:34:500}
mv "$f" "$b"
done
вы можете попробовать строку за строкой на оболочке:
f="CombinedReports_LLL-20140211144020(Untitled_11).csv"
b=${f:0:20}${f:34:500}
echo $b
Я использую совет, приведенный в верхнем ответе, и поместил следующую строку в сценарий оболочки:
ls *.nii | xargs rename 's/[f_]{2}//' f_0*.nii
в терминале эта строка работает отлично, но в моем скрипте она не будет выполняться и читается * как литеральная часть имени файла.