Скопировать файлы .txt в определенную директорию

У меня проблема с копированием файла в моих каталогах.

У меня есть файлы .txt и .jpeg во многих каталогах, и я хочу скопировать только файлы .txt соответствии с каталогом. Например, у меня есть следующее:

 direct/direct1 direct/direct2 direct1: file.txt file2.txt file.jpeg file2.jpeg direct2: file3.txt file4.txt file3.jpeg file4.jpeg 

в моей команде копирования мне нужны только файлы .txt из каждой директории

2 Solutions collect form web for “Скопировать файлы .txt в определенную директорию”

Вы можете использовать find только для выбора файлов `.txt из-под какого-то каталога:

 find direct/direct? -name "*.txt" 

это будет распечатывать все файлы, поэтому вы можете проверить, что у вас есть то, что вы хотели, и не слишком много будет выбрано. *.txt должен быть указан, иначе оболочка попытается развернуть это .txt файлы в текущем каталоге.

Что касается копирования, вы хотите сделать (чаще всего) одну из двух вещей: сохранить путь под прямым файлом .txt или нет. Чтобы сохранить его, используйте:

 find direct/direct? -name "*.txt" -print0 | cpio -pdmv0 target_directory 

чтобы скопировать все файлы .txt в один целевой каталог, используйте что-то похожее на то, что предложил @lambert:

 find direct/direct? -name "*.txt" -exec cp {} target_directory + 

(использование + вместо \; более эффективно, поскольку несколько имен файлов передаются в один cp когда + используется вместо вызова cp для каждого отдельного файла при использовании \; )

Для второй команды -print0 нет необходимости обрабатывать пути со специальными символами, имена файлов, которые заменяют {} , должным образом разделяются путем вызова cp .

Если вы хотите скопировать все .txt файлы в каталог, используйте шаблон подстановки :

 cp direct/direct1/*.txt target 

Это копирует все .txt файлы, которые находятся в каталоге direct/direct1 в target каталог (который уже должен существовать).

Вы можете передавать несколько шаблонов для копирования файлов из нескольких каталогов:

 cp direct/direct1/*.txt direct/direct2/*.txt target 

Если вы хотите скопировать файлы .txt из всех подкаталогов direct , вы также можете использовать подстановочный знак для каталога:

 cp direct/*/*.txt target 

Если вы хотите копировать только из определенных каталогов, вы можете использовать шаблон подстановки, который соответствует только этим каталогам. Например, если direct имеет четыре подкаталога foo , bar , baz и qux и вы хотите копировать только файлы из bar и baz , вы можете использовать

 cp direct/ba?/*.txt target 

Ни один из примеров до сих пор не копирует файлы из самого себя, или из подкаталогов direct . Если вы хотите скопировать файлы .txt из direct , вам необходимо включить его в список, например

 cp direct/*.txt direct/*/*.txt target 

Если вы хотите скопировать файлы из direct , всех его подкаталогов, всех их подкаталогов и т. Д., Вы можете использовать подстановочный символ ** , если ваша оболочка поддерживает его. Он работает из коробки в zsh, но в bash вам нужно сначала включить его с помощью shopt -s globstar .

 cp direct/**/*.txt target 

Обратите внимание, что все файлы копируются в сам target , это не воспроизводит структуру каталогов. Если вы хотите воспроизвести структуру каталогов, вам понадобится другой инструмент, например rsync ( tutorial ) или pax .

 rsync -am --include='*.txt' --include='*/' --exclude='*' direct/ target/ cd direct && pax -rw -pe -s'/\.txt$/&/' -s'/.*//' . target/ 
  • Загружать / синхронизировать файлы только в одном направлении
  • Скопируйте только файлы и только строки, содержащие строку, сохраняя структуру каталогов
  • ls показывает каталог, но он недоступен
  • копировать файлы с одного пути на другой путь в Linux
  • Интересное поведение защищенной копии
  • Что происходит, когда я убиваю 'cp'? Это безопасно и имеет ли это какие-либо последствия?
  • зарезервировать дисковое пространство перед копированием файлов
  • Найти каталог и скопировать другой каталог в найденный каталог?
  • Копирование файлов на несколько компьютеров по локальной сети
  • Как сделать дубликаты с разными именами из одного файла?
  • Проверка присоединения Rsync не отражает каталоги
  • Linux и Unix - лучшая ОС в мире.