Para obter a parte YEAR
do nome do arquivo MY_AMAZING_FILE_THAT_IMADEIN_YEAR_TY.pdf
sem usar utilitários externos:
name='MY_AMAZING_FILE_THAT_IMADEIN_YEAR_TY.pdf'
year=${name%_*} # remove everything after the last '_'
year=${year##*_} # remove everything up to the last (remaining) '_'
Após a atualização da pergunta:
Movendo arquivos PDF de topdir
para um diretório /some/path/destination/<year>/<parent>
, em que <year>
é o ano encontrado no nome do arquivo, e <parent>
é o nome base do diretório original em que o arquivo foi encontrado:
find topdir -type f -name '*.pdf' -exec bash ./movefiles.sh {} +
movefiles.sh
é um script de shell no diretório atual:
#!/bin/bash
destdir='/some/path/destination'
for name; do
# get basename of directory
parent=${name%/*}
parent=${parent##*/}
# get the year from the filename:
# - Pattern: _YYYY_ (in the middle somewhere)
# - Pattern: _YYYYMMDD.pdf (at end)
if [[ "$name" =~ _([0-9]{4})_ ]] ||
[[ "$name" =~ _([0-9]{4})[0-9]{4}\.pdf$ ]]; then
year="${BASH_REMATCH[1]}"
else
printf 'No year in filename "%s"\n' "$name" >&2
continue
fi
# make destination directory if needed
# (remove echo when you have tested this at least once)
if [ ! -d "$destdir/$year/$parent" ]; then
echo mkdir -p "$destdir/$year/$parent"
fi
# move file
# (remove echo when you have tested this at least once)
echo mv "$name" "$destdir/$year/$parent"
done