С помощью zsh
вы может сделать:
files=(${(f)"$(cut -d , -f 1 <movies.csv)"})
glob=('$files['{1..$#files}']')
eval "tocopy=(Movies/**/(${(j:|:)glob})(D.))"
print -rl -- $tocopy # to check it's OK
cp -i -- $tocopy Sorted_Media/
Объяснение:
cut -d, -f1 : получить первый столбец csv (одно имя файла в строке).
$ {(f) "$ (cmd)"}
: разделить вывод cmd
на перевод строки ( $ files
теперь представляет собой массив со всем файлом имена). glob = ('$ files [' {1 .. $ # files} ']')
: создать еще один массив с элементами буквально $ files [1]
, $ files [2]
... $ {(j: |:) array}
: объединить элементы массива с помощью |
, поэтому мы в основном оцениваем tocopy = (Фильмы / ** / ($ files [1] | $ files [2] | ... | $ files [n]) (DN.))
команда (где n
- количество элементов в массиве $ files
). ** /
: рекурсивная глобализация (поиск файлов в подкаталогах любого уровня). (D.)
: квалификаторы glob (поиск также и в скрытых каталогах (D), только в обычных файлах (.)) Или с помощью инструментов GNU:
find Movies -type f -print0 |
awk '
!d {f[$1]; next}
$NF in f {
delete f[$NF]
print
}' FS=, file.csv d=1 FS=/ RS='\0' ORS='\0' - |
xargs -r0 cp -vt Sorted_Media/
Используя delete
, мы убеждаемся, что копируется только первый экземпляр (если есть несколько файлов с одинаковым именем). -i
в решении zsh дает вам возможность решить, что делать в случае конфликта. Мы не можем использовать здесь -i
, потому что стандартный ввод cp
больше не является терминалом.
Замените cp
на echo cp
, если вы просто хотите проверить, что он будет делать, не делая этого на самом деле.
$ set -f; IFS=" "
$ set $(perl -F\; -lane '$A[$F[1]<0] += $F[1]}{print "@A"' "$file")
$ plus=$1 minus=$2
плюс:
awk -F';' '$2~/^[^\-]/{s+=$2} END{print s}' data
минус:
awk -F';' '$2~/^[\-]/{s+=$2} END{print s}' data