Move все файлы с соответствующими префиксами для папки на основе списка csv

Переменные нужно заключать в кавычки, чтобы оболочка не выполняла split + glob :

gawk -v FTIMESTAMP="$FTIMESTAMP" -v DSECONDS="$DSECONDS" ...

Обратите внимание, что -v var = "$ shell_var" расширит escape-последовательности в $ shell_var . Вам нужно использовать переменные ENVIRON или ARGV для передачи $ shell_var как есть из оболочки в awk .

0
11.05.2018, 07:47
2 ответа
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.

1
28.01.2020, 04:23

Подобный скрипт вполне может работать. Думайте о коде ниже как о метаязыке, просто чтобы дать вам представление о том, как это делать!

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
0
28.01.2020, 04:23

Теги

Похожие вопросы