Anirvan Ray
Anirvan Ray

Reputation: 51

Remove YYYY_MM_DD_HH_MM from filename

We have few csv and xml files in following formats

String_YYYY_MM_DD_HH_MM.csv

String_YYYY_MM_DD_HH_MM.xml

String.xml

String.csv

Examples:

Reference_Categories_2021_02_24_17_14.csv
CD_CategoryTree_2021_02_24_17_14.csv
New_Categories.xml
Mobile_Footnote_2021_03_05_16_21.csv
Campaign_Version_2018_09_24_20_00.xml
Campaign_new.csv

Now we have to remove _YYYY_MM_DD_HH_MM from filenames so result will be

Reference_Categories.csv
CD_CategoryTree.csv
New_Categories.xml
Mobile_Footnote.csv
Campaign_Version.xml
Campaign_new.csv

Any idea how to do that in bash?

Upvotes: 0

Views: 91

Answers (3)

M. Nejat Aydin
M. Nejat Aydin

Reputation: 10123

In pure bash:

pat='_[0-9][0-9][0-9][0-9]_[0-9][0-9]_[0-9][0-9]_[0-9][0-9]_[0-9][0-9]'

for f in *$pat*.{csv,xml}; do echo mv "$f" "${f/$pat}"; done

Delete the echo if the output looks fine.

Upvotes: 3

j_b
j_b

Reputation: 2020

Using bash, find, and awk:

Use find to find files with .csv or .xml suffix in the current directory. Pipe the find output to awk and create the mv commands that are output and passed to bash.

bash < <(find * -type f \( -name '*.csv' -o -name '*.xml' \) | awk '{orig=$0; gsub(/_[0-9]{4}_[0-9]{2}_[0-9]{2}_[0-9]{2}_[0-9]{2}/,""); print "mv "orig" "$0}')

Directory contents before:

find * -type f
CD_CategoryTree_2021_02_24_17_14.csv
Campaign_Version_2018_09_24_20_00.xml
Campaign_new.csv
Mobile_Footnote_2021_03_05_16_21.csv
New_Categories.xml
Reference_Categories_2021_02_24_17_14.csv

Directory contents after:

find * -type f
CD_CategoryTree.csv
Campaign_Version.xml
Campaign_new.csv
Mobile_Footnote.csv
New_Categories.xml
Reference_Categories.csv

Upvotes: -1

Jetchisel
Jetchisel

Reputation: 7791

With bash Something like:

shopt -s nullglob

for f in *.{xml,csv}; do
  ext="${f##*.}"
  [[ "${f%%_[0-9]*}" = *.@(xml|csv) ]] && continue
  echo mv -v -- "$f" "${f%%_[0-9]*}.$ext"
done

With the =~ operator and BASH_REMATCH

shopt -s nullglob

regexp='^(.{1,})(_[[:digit:]]{4}_[[:digit:]]{2}_[[:digit:]]{2}_[[:digit:]]{2}_[[:digit:]]{2})([.].*)$'

for f in *.{xml,csv}; do
  [[ "$f" =~ $regexp ]] &&
  echo mv -v -- "$f" "${BASH_REMATCH[1]}${BASH_REMATCH[-1]}"
done

  • Remove the echo if you're satisfied with the output.

Upvotes: 2

Related Questions