Захват вывода командной строки в переменной в Unix

#bash #hash #password-hash #sha512 #cracking

#linux #bash #unix

Вопрос:

Я хочу зафиксировать вывод приведенной ниже команды в переменной.

Команда:

 find . -iname 'FIL*'.TXT
 

Вывод :

 ./FILE1.TXT
 

Я хочу захватить ‘./FILE1.TXT’ в переменную ‘A’. Но когда я пытаюсь

 A=`find . -iname 'FIL*'.TXT`
 

затем эта команда отображает данные файла. Но мне нужно ./FILE1.TXT значение в переменной A.

Комментарии:

1. Пожалуйста, улучшите формулировку вашего вопроса. Имя файла не совпадает с содержимым файла (а некоторые файлы не имеют или имеют несколько имен, поскольку файлы являются индексами ).

2. Непонятно, почему команда в back-ticks копирует данные из вашего файла в вашу переменную, а не имя файла. Как правило, лучше использовать $(...) нотацию для подстановки команд , но это не должно влиять на ситуацию. Вы могли бы использовать -print как часть find команды, но это не должно иметь значения. Возможно, вы неправильно обращаетесь с кодом, который сообщает имя файла; это должно быть просто echo "$A" или printf "%sn" $A или что-то подобное. Будьте осторожны с пробелами (или, что еще хуже, с новыми строками) в именах файлов.

Ответ №1:

 # ls *.txt
test1.txt  test.txt
# find ./ -maxdepth 1 -iname "*.txt"
./test1.txt
./test.txt
# A=$(find ./ -maxdepth 1 -iname "*.txt")
# echo $A
./test1.txt ./test.txt
 

Вы можете игнорировать -maxdepth 1 , если хотите. Я должен был использовать его для этого примера.

Или с помощью одного файла:

 # ls *.txt
test.txt
# find ./ -maxdepth 1 -iname "*.txt"
./test.txt
# A=$(find ./ -maxdepth 1 -iname "*.txt")
# echo $A
./test.txt
 

Ответ №2:

Вы пытаетесь ?

 A="`find . -iname 'FIL*'.TXT`"
 

и

 A="`find . -iname 'FIL*'.TXT -print`"
 

Ответ №3:

Файл не имеет никакого значения, но имеет содержимое. Для отображения этого содержимого используйте следующее.

   find . -iname 'FIL*'.TXT -exec cat {} ;
 

Если вы хотите, чтобы все содержимое (всех таких файлов) было в переменной, то

   A=$(find . -iname 'FIL*'.TXT -exec cat {} ;)
 

Кстати, вы могли бы использовать

   find . -iname 'FIL*.TXT' -print0 | xargs -0 cat 
 

Если вам нужны имена таких файлов в переменной, попробуйте

   A=$(find . -iname 'FILE*.txt' -print)
 

Кстати, в некоторых нескольких последних интерактивных оболочках ( zsh bash версии 4, но не более ранних версиях) просто напишите

   A=**/FILE*.txt
 

Мне кажется, что эта ** функция сама по себе стоит того, чтобы перейти на более новую оболочку, но это только мое мнение.

Кроме того, не забывайте, что файлы могут иметь несколько имен или вообще не иметь их. Прочитайте об индексах

Комментарии:

1. Но мне нужно имя файла, потому что имя файла является динамическим. Оно может отличаться после FIL word.

2. Приведенные выше команды отображают содержимое файла. Я не хочу видеть содержимое файла. Не могли бы вы, пожалуйста, предложить другое решение.

3. эй, последний не работает. кошка: */FILE.txt : Нет такого файла или каталога

4. Двойная звезда **/ является расширением в некоторых оболочках, например zsh , или bash версии 4, но не версии 3. Вы могли бы рассмотреть возможность использования zsh