Попытка кошки файлы - нераспознанный подстановочный знак - PullRequest
0 голосов
/ 21 апреля 2010

Я пытаюсь создать файл, который содержит весь код приложения. Я создал файл с именем catlist.txt, чтобы файлы добавлялись в том порядке, в котором они мне нужны.

Фрагмент моего catlist.txt:

app/controllers/application_controller.rb
app/views/layouts/*

app/models/account.rb
app/controllers/accounts_controller.rb
app/views/accounts/*

Когда я запускаю команду, файлы, перечисленные в явном виде, добавляются, а подстановочные файлы - нет.

cat catlist.txt|xargs cat > fullcode

Я получаю

cat: app/views/layouts/*: No such file or directory
cat: app/views/accounts/*: No such file or directory

Может кто-нибудь помочь мне с этим. Если есть более простой метод, я открыт для всех предложений.

Барб

Ответы [ 3 ]

1 голос
/ 21 апреля 2010

Ваша проблема в том, что xargs не является оболочкой, поэтому подстановочный знак интерпретируется буквально как звезда. Вам понадобится оболочка, чтобы выполнить расширение для вас так:

cat catlist.txt | xargs -I % sh -c "cat %" > fullcode

Обратите внимание, что * не является рекурсивным в вашем файле данных. Я полагаю, это было то, что вы имели в виду. Если вы хотите, чтобы записи были рекурсивными, это немного сложнее и потребует чего-то более похожего на скрипт DevNull, но для этого потребуется немного изменить файл данных, чтобы не включать звездочки.

0 голосов
/ 21 апреля 2010

используйте цикл чтения для чтения вашего файла

while read -r file
do
   if [ -f "$file" ]; then
    yourcode "$file"
   fi       
   # expand asterix 
   case "$file" in 
     *"*" ) 
        for f in $file
        do
           yourcode "$f"
        done
   esac
done <"catlist.txt"
0 голосов
/ 21 апреля 2010

Вы уверены, что эти каталоги существуют?

Проблема с размещением кошки в таком списке (где вы используете символы подстановки) состоит в том, что кошка не является рекурсивной. Он будет только перечислять содержимое этого каталога; нет подкаталогов.

Вот что я бы сделал:

#!/bin/bash.exe

output="out.txt"

if [ -f "$output" ]
then 
   rm $output
fi

for file in $(cat catlist.txt)
do
   if [ -f "$file" ]
   then
      echo "$file is a file."
      cat $file >> $output
   elif [ -d "$file" ]
   then
      echo "$file is a directory."
      find $file -type f -exec cat {} >> $output \;
   else
      echo "huh?"
   fi
done

Если указанная запись является каталогом, она находит все файлы с этого момента и отслеживает их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...