оболочка linux получает имя файла - PullRequest
2 голосов
/ 08 марта 2012

Я пишу сценарий оболочки.

У меня есть следующие файлы:

2012-03-08_16-37-41
2012-03-08_16-37-43
2012-03-08_16-37-46
2012-03-08_16-37-55

Простой скрипт:

#!/bin/bash
FILENAME= ????
echo $FILENAME
Значение

и FILENAME должно быть 2012-03-08_16-37-55 (последний элемент списка имен отсортированных файлов). Кроме того, начало имени файла должно быть 2012.

Как я мог решить эту проблему?

Ответы [ 5 ]

5 голосов
/ 08 марта 2012
FILENAME=$(ls -r 2012* | head -n 1)
2 голосов
/ 08 марта 2012

Не парсинг вывода ls . Вместо этого используйте find:

#!/bin/sh

find . -name 2012* | sort | tail -1

Чтобы присвоить результат переменной:

#!/bin/sh

filename=$(find . -name 2012* | sort | tail -1)

Это также дает вам доступ ко всем множествам найденных опций , включая (не) следующие символические ссылки, рекурсию, только возврат файлов (не каталогов), проверку временных меток и т. Д.

1 голос
/ 08 марта 2012

Вы можете использовать либо команду ls для получения файлов, либо просто использовать «подстановку файлов» для расширения подстановочных знаков.

#!/bin/sh

for filename in 2012*; do
  echo "File (by globbing) is $filename"
done

ls 2012* | while read filename; do
  echo "File (via ls) is $filename"
done

Чтобы получить последний, самый простой способ - отсортировать вывод ls:

filename=`ls -r 2012* | head -1`

Но вы также можете просто взять хвост, если хотите быть грязным.

for filename in 2012*; do
  echo "File (by globbing) is $filename"
done | tail -1
0 голосов
/ 08 марта 2012

Без использования каких-либо внешних команд: set 2012*; eval FILE=\$$#. Это совершенно безопасное использование eval.

0 голосов
/ 08 марта 2012
f=""; 
for f in 2012* ; 
do
  # haha - don't do anything. 
  dummy=42
done; 
echo "now do something with $f"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...