Chciałbym skopiować każdy plik ze struktury katalogów do określonego katalogu tylko wtedy, gdy plik już tam nie istnieje.
Dostałem pierwszą część z tego pytania dotyczącego przepełnienia stosu :
find . -type f -exec cp {} /target-directory \;
Jak mogę sprawdzić, czy plik istnieje, czy nie? Jeśli nie, skopiuj plik, w przeciwnym razie pomiń.
command-line
bash
files
find
pan au
źródło
źródło
Odpowiedzi:
Możesz użyć
-u
przełącznika zcp
polecenia:lub użyj
rsync
polecenia z--ignore-existing
:Przykład:
źródło
Oryginalne polecenie można przepisać jako:
Kluczem jest to, że wywołujemy powłokę za pomocą określonych poleceń i przekazujemy znaleziony plik jako
$1
argument. Jeśli siętest -e /target-directory/"$1"
nie powiedzie, oznacza to, że plik nie istnieje, w którym to przypadkucp
plik zostanie skopiowany.Zasadniczo można używać innych poleceń, o ile polecenie może zweryfikować istnienie pliku. Niektóre inne alternatywy:
/usr/bin/realpath -e /target-directory/"$1" > /dev/null || cp "$1" /target-directory
stat >/dev/null /target-directory/"$1" || cp "$1" /target-directory/"$1"
źródło
stat
testować istnienie pliku w Bash? Czy nietest -e
byłoby o wiele prostsze?Przeczytaj
man cp
i użyj--no-clobber
opcji docp
.źródło