Я пытаюсь сделать довольно простую вещь. У меня есть 40 текстовых файлов, в которых нужно удалить все и заменить содержимым шаблонного текстового файла.
Какой самый простой/быстрый способ?
NB: Я не хочу искать и заменять, а хочу удалить все и потом скопировать. Это было бы как открыть файл, ctrl + A >> del >> ctrl + v для каждого файла
решение1
Unix-подобный
В командной строке Unix-подобной системы (в Linux, OSX и т. д.) можно использовать команду cat
для вывода содержимого файла на STDOUT, а также >
для перенаправления STDOUT в файл, перезаписывая его содержимое.
cat template.txt > file.txt
Самый простой способ — поместить файл template.txt
в отдельный каталог, а затем использовать цикл for для обработки каждого *.txt в рабочем каталоге:
for f in ./*.txt; do cat /path/to/template.txt > "$f"; done
В системах с bash 4+ (вероятно, это есть в любой современной *nix; проверьте с помощью bash --version
), вы можете использовать расширенную подстановку, чтобы иметь template.txt
в том же каталоге файлы, которые вы хотите перезаписать:
shopt -s extglob
for f in ./!(*template).txt; do cat template.txt > "$f"; done
Если у вас есть текстовые файлы во многих подкаталогах (ВНИМАНИЕ: ЭТО ПРИВЕДЕТ К ПЕРЕЗАПИСИВСЕ *.txt
ФАЙЛЫ В РАБОЧЕМ КАТАЛОГЕ И ВСЕХ ЕГО ПОДКАТАЛОГАХ, И ВСЕХ ИХ ПОДКАТАЛОГАХ...), вы можете использовать globstar:
shopt -s globstar
for f in ./**/*.txt; do cat /path/to/template.txt > "$f"; done
## OR:
shopt -s globstar extglob
for f in ./**/!(*template).txt; do cat template.txt > "$f"; done
Окна
Это работает аналогично, хотя синтаксис отличается. Вместо cat
, используйте type
:
type template.txt > file.txt
Для работы с каждым .txt
элементом каталога:
FOR %F IN (*.txt) DO type C:\path\to\template.txt > %F
Для рекурсивности используйте /R
:
FOR /R %F IN (*.txt) DO type C:\path\to\template.txt > %F
решение2
Ну, то, что вы хотите, можно сделать с помощью автоматизированного поиска и замены (вроде того, что делает powergrep, но бесплатно), но проще просто взять шаблон и скопировать его в каждый новый файл. Это можно сделать из командной строки.
Создайте файл со списком всех имен файлов, в которые вы хотите поместить этот шаблон.
Итак, listoffiles.txt имеет следующее содержимое:
файл1.txt
файл2.txt
файл3.txt
Затем откройте командную строку и выполните:
C:\fdf>for /f %f in (listoffiles.txt) do @echo copy template.txt %f
копировать template.txt file1.txt
копировать template.txt file2.txt
копировать template.txt file3.txtС:\фдф>
Просто измените строку @echo copy template.txt на copy template.txt. Т.е. удалите @echo или просто echo.
Вам нужен listoffiles.txt в c:\fdf и template.txt там же. И это создаст file1.txt file2.txt и т.д.