Команда Rsync и cp для копирования файлов «.txt» в один каталог (только если он уже существует)

Основываясь на ответе Ориона , less (1) справочная страница описывает

/ шаблон

    Поиск вперед в файле N -й строки , содержащей шаблон . N по умолчанию 1. Шаблон является регулярным выражением, как распознается библиотека регулярных выражений, предоставляемая вашей системой. Поиск начинается со второй отображаемой строки (но см. Параметры -a и -j , которые меняют это). {{1} }

    Некоторые символы являются специальными , если вводятся в начале шаблона ; они скорее изменяют тип поиска чем стать частью шаблона :

    ^ N или !

      Искать строки, которые НЕ соответствуют шаблону .
    ^ E или *
      Поиск нескольких файлов. То есть, если поиск достигает КОНЕЦ текущего файла , не находя совпадения, поиск продолжается в следующем файле в списке командной строки.
    ^ F или @
      Начните поиск с первой строки ПЕРВОГО файла в списке командной строки, независимо от того, что в данный момент отображается на экран или настройки параметров -a или -j .
    ^ K
      Выделите любой текст , который соответствует шаблону на текущем экране, , но не переходите к первому совпадению (СОХРАНИТЬ текущую позицию) .
    ^ R
      Не интерпретируйте метасимволы регулярных выражений, то есть проводите простое текстовое сравнение.

    ____________
    Командам может предшествовать десятичное число, называемое N в описании…

(Конечно ] ^ N и ^ E и т. Д. Представляют собой Ctrl + N и Ctrl + E и т. Д.)

Оказывается, что паттерн и и / паттерн хорошо работают вместе. Например, команды

  • &! Arp | dns Введите
  • / Ctrl + K fail | fatal | fault | sd [az ] [0-9] Введите

в любом порядке, чтобы скрыть (исключить) все строки , содержащие arp или dns (например, ] grep -v ), а затем в оставшихся строках выделите все вхождения fail , fatal , fault , или что-нибудь похожее на имя устройства SCSI ( sd [az] [0-9] ). Обратите внимание, что строки, содержащие arp или dns , , а также не содержат или любые другие опасные слова, {{ 1}} не будет отображаться , но не .

3
09.02.2018, 09:50
2 ответа

rsynctiene una bandera, --existing, que evitará copiar archivos que aún no existen en el destino:

find. -type f -name '*.txt' -exec rsync --existing {} "$HOME/alltxt/" ';'

También agregué -type fpara asegurarme de que findsolo encuentre archivos normales , y eliminé el indicador -R(--relative)de rsyncporque no creo es útil en este caso (usar este indicador también es la razón por la que obtiene los subdirectorios en el destino ). También estoy usando $HOMEen lugar de ~porque creo que se ve mejor.

También puede agregar-a(--archive)a la invocación rsyncpara preservar la propiedad y los tiempos de modificación, etc.

Un enfoque similar, pero usando cpen lugar dersync:

find. -type f -name '*.txt' \
    -exec sh -c 'for n; do d="$HOME/alltxt/${n##*/}"; [ -f "$d" ] && cp "$n" "$d"; done' sh {} +

Esto encuentra todos los archivos .txty llama a un script de shell corto:

for n; do
    d="$HOME/alltxt/${n##*/}"
    [ -f "$d" ] && cp "$n" "$d"
done

Este ciclo obtiene una cantidad de .txtarchivos de find. Para cada uno de estos nombres n, crea la ruta del archivo de destino en d,comprueba si esta ruta se refiere a un archivo regular existente y, de ser así, copia allí el archivo dado.

En lugar de la prueba [ -f "$d" ], podría usar [ "$d" -ot "$n" ], que se cumplirá si el archivo de destino existe y es más antiguo que el archivo encontrado. Esta es una prueba no estándar pero es compatible con la mayoría de los shells.

La sustitución de variable ${n##*/}eliminará los directorios de la ruta en n, de modo que ./some/path/file.txtse convierta en solofile.txt(el nombre base ). Podría ser reemplazado por $(basename "$n").

2
27.01.2020, 21:25
shopt -s globstar
cp --update --target-directory targetDirectory sourceRootDir/**/*.txt

donde:

  • shopt -s globstarestablece las opciones extendidas de globbing, que incluyen el patrón **
  • --target-directoryo -tda un directorio de destino para copiar a (también se puede especificar al final de todos los argumentos, pero a menudo es más legible ponerlo aquí en scripts ).
  • --updateo -uhace que cpcopie el archivo solo si el destino es más antiguo i o no -existente.
0
27.01.2020, 21:25

Теги

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