Переменные нужно заключать в кавычки, чтобы оболочка не выполняла split + glob :
gawk -v FTIMESTAMP="$FTIMESTAMP" -v DSECONDS="$DSECONDS" ...
Обратите внимание, что -v var = "$ shell_var"
расширит escape-последовательности в $ shell_var
. Вам нужно использовать переменные ENVIRON
или ARGV
для передачи $ shell_var
как есть из оболочки в awk
.
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
.
Подобный скрипт вполне может работать. Думайте о коде ниже как о метаязыке, просто чтобы дать вам представление о том, как это делать!
for i in `ls *.PNG`
do
a=$(echo $i | awk -F_ '{print $1}')
b=$(grep $a file.csv|awk '{print $2}')
mv $i $b/
done