Объединить файлы в разных каталогах, запустив скрипт на терминале
Я новичок в 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-* или так.
Теперь я надеюсь, что вы сможете использовать это, потому что меня нет.