Использованиеsort
:
$ ls -lghFG | sort -n -td -k2
total 0
-rw-r--r-- 1 0 Aug 3 09:43 tig_10.d1
-rw-r--r-- 1 0 Aug 3 09:43 tig_10.d2
-rw-r--r-- 1 0 Aug 3 09:43 tig_10.d3
-rw-r--r-- 1 0 Aug 3 09:43 tig_10.d4
-rw-r--r-- 1 0 Aug 3 09:43 tig_10.d5
-rw-r--r-- 1 0 Aug 3 09:43 tig_10.d6
-rw-r--r-- 1 0 Aug 3 09:43 tig_10.d7
-rw-r--r-- 1 0 Aug 3 09:43 tig_10.d8
-rw-r--r-- 1 0 Aug 3 09:43 tig_10.d9
-rw-r--r-- 1 0 Aug 3 09:43 tig_10.d10
-rw-r--r-- 1 0 Aug 3 09:43 tig_10.d11
-rw-r--r-- 1 0 Aug 3 09:43 tig_10.d12
-rw-r--r-- 1 0 Aug 3 09:43 tig_10.d13
-rw-r--r-- 1 0 Aug 3 09:43 tig_10.d14
-rw-r--r-- 1 0 Aug 3 09:43 tig_10.d15
Это будет использовать букву d
в качестве разделителя и сортировать вывод в числовом виде в поле 2, поэтому могут возникнуть проблемы, если ваши имена файлов содержат букву d
.
Чтобы удовлетворить ваше требование использовать ll
(, который является псевдонимом ), вы можете сделать (не рекомендуется:
alias ll='ls -lghFG | sort -n -td -k2'
Всего несколько изменений в том, что у вас было. Основные изменения заключаются в использовании подстановки для поиска файлов и расширении параметров для выделения частей путей к файлам и расширений. Включите опцию nullglob, чтобы значение FOUND _FILE было нулевым, если совпадений нет. Поскольку вы знаете, что готовый файл существует из-за совпадения в цикле for, вы можете проверить, есть ли соответствующий PDF-файл. Если это так, проверьте, не существует ли файл pdf или готовый файл в вашем целевом каталоге. Используйте временную метку эпохи в качестве суффикса файла при наличии конфликта. Это не идеально, потому что все еще существует небольшая вероятность того, что новое имя файла существует. Вы могли бы проверить еще раз, если это было реальной проблемой.
#!/bin/bash
# source directory where all files are
SOURCE_DIR=/var/xms/batch/PDF
# Name of directory you want to move the PDFs to.
DEST_DIR=/var/xms/batch/PDF/put_ready
# Create the destination directory for the moved PDFs, if it doesn't already exist.
[ ! -d "$DEST_DIR" ] && mkdir -p "$DEST_DIR"
# Enable nullglob in the event of no matches
shopt -s nullglob
# Search for.done files starting in $SOURCE_DIR
for FOUND_FILE in "$SOURCE_DIR"/*.done
do
# Get root file path without extension
FILE_ROOT="${FOUND_FILE%%.*}"
# Is there a.pdf to go with the.done file
if [ -f "${FILE_ROOT}.pdf" ]
then
# Do either of these files exist in the DEST_DIR
if [ -f "$DEST_DIR/${FILE_ROOT##*/}.pdf" ] || [ -f "$DEST_DIR/${FILE_ROOT##*/}.done" ]
then
# Use epoch stamp as unique suffix
FILE_SFX="$(date +%s)"
## You could still have a file conflict is the DEST_DIR and
## maybe you consider checking first or modifying the move command
# Move the file pairs and add the new suffix
mv "${FILE_ROOT}.done" "$DEST_DIR/${FILE_ROOT##*/}_${FILE_SFX}.done"
mv "${FILE_ROOT}.pdf" "$DEST_DIR/${FILE_ROOT##*/}_${FILE_SFX}.pdf"
else
# Move the file pairs
mv "${FILE_ROOT}.done" "$DEST_DIR/${FILE_ROOT##*/}.done"
mv "${FILE_ROOT}.pdf" "$DEST_DIR/${FILE_ROOT##*/}.pdf"
fi
fi
done
##
## End of script.
##
Попробуйте это:
for FILE in $(ls $SOURCE_DIR/*.done); do NAME=${FILE::-4}; mv ${NAME}pdf $DEST_DIR 2>/dev/null && mv $FILE $DEST_DIR; done