Команда для записи всех файлов .js в один файл? - proUbuntu
2 голосов
/ 18 октября 2015

Я пытаюсь поместить все .js файлы в каталог и подкаталоги в один файл в лексическом порядке. Я пробовал:

grep -r --include=*.js * > dir/.filename 

Что я сделал не так?

Ответы [ 2 ]

3 голосов
/ 18 октября 2015

Вы можете использовать find для поиска файлов и затем sort для сортировки имен:

find . -type f -name '*.js' | sort 

Чтобы сохранить имена в файле:

find . -type f -name '*.js' | sort >files.txt

Давайте проанализируем вашу команду:

grep -r --include=*.js *
  • Вам необходимо указать имя каталога в качестве аргумента при использовании опции -r, например. (также поместите '' вокруг совпадения глобуса, чтобы они не дали неожиданных результатов):

    grep -r --include='*.js' .
    

    Это будет искать непустые файлы, т.е. это эквивалентно:

    grep -r --include='*.js' '.' .
    
  • Если вы хотите проверить определенный шаблон, например, строки, начинающиеся с TERM:

    grep -r --include='*.js' '^TERM' .
    

В любом случае, главное - grep ищет содержимое файла для любого совпадения, но ваша цель состоит в том, чтобы сопоставить имена файлов, поэтому вы должны искать что-то еще, что может сделать это, например, find или оболочка цикла.


Вы также можете использовать опцию globstar bash для рекурсивного поиска файлов, заканчивающихся на .js, а затем отсортировать их с помощью sort.

Сначала вам нужно включить параметр globstar bash:

shopt -s globstar

Теперь **/*.js найдет файлы (и каталоги) с расширением .js.

Таким образом, следующее должно сделать трюк:

for i in **/*.js; do [[ -f $i ]] && echo "$i"; done

[[ -f $i ]] здесь, чтобы гарантировать, что мы имеем дело только с файлами на выходе.

0 голосов
/ 18 октября 2015

grep - инструмент для сопоставления строк. Он подходит для поиска содержимого файла, но не для поиска самих файлов.

Используйте команду find, чтобы сделать это. По умолчанию поиск является рекурсивным и имеет множество параметров для оптимизации поиска.

Например, если бы я хотел рекурсивно найти все обычные файлы (не каталоги) с расширением *.png рекурсивно из каталога /home и до его подкаталогов, я бы сказал find начинать с /home директории, ищите файлы с -type и используйте совпадение без учета регистра с -iname для файлов, заканчивающихся на «.png».

xieerqi:$ find /home -type f -iname "*.png" | head
/home/xieerqi/Downloads/35457542.png
/home/xieerqi/genymotion/icons/icon.png
/home/xieerqi/chinese-calendar-0.8.2/skin/default/ok.png
/home/xieerqi/chinese-calendar-0.8.2/skin/default/no.png
/home/xieerqi/chinese-calendar-0.8.2/skin/default/note.png
/home/xieerqi/chinese-calendar-0.8.2/skin/default/chinesecalendarBGyellow.png
/home/xieerqi/chinese-calendar-0.8.2/skin/blue/ok.png
/home/xieerqi/chinese-calendar-0.8.2/skin/blue/no.png
/home/xieerqi/chinese-calendar-0.8.2/skin/blue/note.png
/home/xieerqi/chinese-calendar-0.8.2/skin/blue/chinesecalendarBGblue.png
...