Объединить файлы в разных каталогах, запустив скрипт на терминале

Я новичок в 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-* или так.

Теперь я надеюсь, что вы сможете использовать это, потому что меня нет.

Удачи!:D

Другие вопросы по тегам