Объединить файлы в разных каталогах, запустив скрипт на терминале
Я новичок в UBUNTU. Как я могу объединить файлы в разных каталогах? Используя кошку, чтобы объединить их всех, это дотошная задача. Это единственный способ, которым я знаю. Заранее спасибо, Сайкат
1 ответ
Имея простые текстовые файлы, вы можете без труда объединить их, используя >>
оператор. Это добавит вывод предыдущей команды в конец файла, указанного после.
Основная процедура (не для многих файлов)
Пример:
Представьте себе структуру каталогов, подобную этой:
parent
|--a
| \--first.txt
\--b
\--second.txt
Теперь содержание a/first.txt
являются
Hello! This is my first Textfile.
~~some lines~~
end
а также b/second.txt
содержит
///////////////////
// //
// second file //
// //
///////////////////
Таким образом, мы можем объединить его, набрав:
$ touch merge.txt
$ cat a/first.txt >> merge.txt
$ cat b/second.txt >> merge.txt
Новый пустой файл merge.txt
в текущем каталоге будет создан и содержимое файлов будет добавлено без перезаписи, как >
сделал бы.
merge.txt
теперь содержит:
Hello! This is my first Textfile.
~~some lines~~
end
///////////////////
// //
// second file //
// //
///////////////////
Готово!
Расширенные сценарии (для покрытия множества файлов в разных каталогах)
Если у вас есть более десяти файлов, возможно, даже в десяти разных каталогах, вы можете создать скрипт bash и позволить компьютеру самостоятельно выполнять все операции выбора и копирования. Если вы совершенно новичок в сценариях bash или shell, я бы порекомендовал вам заранее прочитать немного о том, на что он способен, и получить общее представление о появлении переменных и циклов, чтобы не запутаться.
Я использую верхнюю часть http://www.cyberciti.biz/faq/bash-loop-over-file/ в качестве ссылки сейчас. Наш скрипт будет выглядеть в основном так:
#!/bin/bash
FILES="file1
/path/to/file2"
OUTPUT="merge.txt"
for f in $FILES
do
cat $f >> $OUTPUT
done
(О, я надеюсь, что это будет работать)
Если все ваши файлы разделяют что-то, что отличает их от других файлов, которые мы не хотим объединять, это именно то, что нам нужно. В идеале они имеют общую родительскую или родительскую папку, где вы не можете найти другие файлы, кроме наших. Тогда мы можем просто использовать /the/path/to/that/folder/*
в качестве селектора при определении нашего $FILES
переменная. Как вы видите в модели, мы можем установить несколько селекторов. Я надеюсь, что вы не слишком заботитесь о порядке выбора файлов автоматически, иначе нам придется подумать о том, как это указать... В нашем примере выше мы могли бы установить:
FILES="*/*"
или же FILES="*/*.txt"
или же FILES="a/* b/*"
или так иOUTPUT="merge.txt"
конечно.
Несколько последних мыслей
Может быть, нам нужно обратить внимание на то, чтобы не выбирать наш файл слияния с "*"
, это может закончиться неловко... Выше я поэтому включил один /
каждый раз. Вы также можете просто положить его куда-нибудь еще.
Если ваши файлы следуют некоторому шаблону, например p_some-thing-axy-1
,p_some-thing-axy-1
,p_some-thing-bxz-1
, вы можете выбрать какой-то селектор, как p_some-thing-*
или так.
Теперь я надеюсь, что вы сможете использовать это, потому что меня нет.