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

в терминале эта строка работает отлично, но в моем скрипте она не будет выполняться и читается * как литеральная часть имени файла.