Предположим, у меня есть две директории: D1 и D2.
D1 (f1, f2, f3, f4) D2 (f1, f2)
Я хочу скопировать файлы в D1,которые не находятся в D2, в другой каталог D3:
D3 (f3, f4)
Как мне сделать это в Linux?
Спасибо, Trinity
Посмотрите на пакет "dirdiff".Это позволяет вам делать то, что вы хотите.
В качестве альтернативы эта командная строка bash должна это сделать:
for i in `ls D1` ; do if [ -f D2/$i ]; then echo "skip $i" ; else cp D1/$i D3 ; fi done
Обратите внимание на обратные галочки вокруг ls D1 - не одиночные кавычки!(На клавиатуре США она находится ниже ~ (тильда))
ls D1
Просто потратил большую часть дня, разбирая что-то похожее, и взял ответ из более старого вопроса . Я закончил с довольно сложным bash-скриптом:
#!/bin/bash # setup folders for our different stages DIST=/var/www/localhost/htdocs/dist/ DIST_OLD=/var/www/localhost/htdocs/dist_old/ DIST_UPGRADE=/var/www/localhost/htdocs/dist_upgrade/ cd $DIST find . -type f | while read filename do newfile=false modified=false if [ ! -e "$DIST_OLD$filename" ]; then newfile=true echo "ADD $filename" elif ! cmp $filename $DIST_OLD$filename &>/dev/null; then modified=true echo "MOD $filename" fi if $newfile || $modified; then #massage the filepath to not include leading ./ filepath=$DIST_UPGRADE$(echo $filename | cut -c3-) #create folder for it if it doesnt exist destfolder=$(echo $filepath | sed -e 's/\/[^\/]*$/\//') mkdir -p $destfolder #copy new/modified file to the upgrade folder cp $filename $filepath fi done
при копировании из D1 в D3 используйте -exclude, указав D2 и это будет сделано ...