awk 'NR > 1 { print $1, $2 }' list.csv |
while read -r prefix group; do
find. -type f -name "$prefix*" -exec sh -c '
group="$1"; shift
mkdir -p "$group"
for name do echo mv "$name" "$group"; done' sh "$group" {} +
done
Это будет использовать awk
для подачи цикла while с префиксами и именами групп (, пропуская заголовок файла списка ). Это предполагает, что все префиксы и имена групп не содержат пробелов или табуляций.
Цикл while вызывает find
для поиска всех обычных файлов в текущем каталоге или ниже него, имена которых начинаются с заданного префикса. Для всех таких файлов вызывается следующий короткий сценарий оболочки:
group="$1"
shift
mkdir -p "$group"
for name do
echo mv "$name" "$group"
done
Этот сценарий ожидает, что имя группы будет первым аргументом в командной строке, а остальные аргументы будут путями к файлам, которые нужно переместить в этот групповой каталог.
Сценарий создает групповой каталог в текущем рабочем каталоге, если он еще не существует, а затем перебирает заданные пути, перемещая каждый файл на место. Не выполняется проверка на перезапись файлов.
echo
защищает mv
от запуска. Запустите код с echo
, чтобы убедиться, что он работает, а затем удалите echo
.
Вы можете отформатировать строку так, чтобы отображались только дата и время, а затем использовать cut, чтобы избавиться от первого столбца:
stat -c '%.19y %i %A %n' * | cut -d' ' -f2-
Редактировать :Добавление описания параметров резки по запросу.
-d' ' ; use space character as field delimiter
-f2- ; print field number 2 and continue to end of line
(aka delete first field/column in this case)
Я использовал awk, чтобы получить желаемое
stat -c '%y %i %A %n' k |awk '{gsub(/^[0-9]*-[0-9]*-[0-9]* /,"",$0);$2="";gsub(/\..*/,"",$1);print }'
Проверено, работает нормально
Вы всегда можете использовать zsh
встроенную функцию stat
вместо (, которая предшествует GNU stat
; будьте осторожны, разные системы имеют разные и несовместимые реализации stat
, это не стандартная команда):
#! /bin/zsh -
zmodload zsh/stat
for f (*(N)) {
stat -F%T -LH s -- $f &&
print -r $s[mtime] $s[inode] $s[mode] $f
}