2015-04-20 2 views
0

Есть ли сокращение в bash для выбора произвольного файла? * перечисляет все файлы в текущем каталоге, но что делать, если я хочу только один файл и не волнует, что это такое?Bash: любой файл в текущем каталоге

FWIW Я тестирую несколько разных команд ffmpeg в каталоге с похожими именами видеофайлов, поэтому вкладка завершена громоздкой.

+0

Вы хотите, скажем, случайный файл, чтобы каждый раз получать разные результаты? Или это нормально всегда просто выбрать первый? Вы можете просто захватить '*' в списке и выбрать один из них, используя '1' или' $ RANDOM'. –

+0

@ AndrewJanke либо в порядке: случайный или тот же. Я идеально надеюсь на что-то лишь несколько символов, чтобы его можно было легко перепечатать при прототипировании разных команд. Я предполагаю, что это можно было бы решить, используя 'mv', чтобы переименовать любой файл в один символ, но я предпочел бы использовать подход без переименования, что бесполезно, потому что это нужно делать вручную. Это плохо, если имена файлов имеют смысл (и пользователь не обращает внимания на 'mv'). – Aprel

+0

Будет что-то вроде 'find. -type f -print -quit' работает для вашего дела? – livibetter

ответ

2

Вот надежный способ получить первый или случайный файл в каталоге, обработки края случай не имея каких-либо файлов:

#!/bin/bash 
# Let globs expand to 0 elements instead of themselves if no matches 
shopt -s nullglob 

# Add all the files in the current dir to an array 
files=(*) 

# Check if the array has any elements 
if [[ ${#files[@]} -gt 0 ]] 
then 
    first_file=${files[0]} 
    random_file=${files[RANDOM%${#files[@]}]} 

    echo "The first file is ${first_file}" 
    echo "A random file is ${random_file}" 
else 
    echo "There are no files in the current directory." 
fi 

Если вы просто хотите что-то короткое и Hacky для интерактивного тестирования, вы может создать массив и ссылаться на него UnIndexed, чтобы получить первый элемент с минимальным типизации:

$ testfile=(*.avi) 
$ ffmpeg -i "$testfile" test.mp3 

Вы также можете связать Tab для завершения ЗШ стиль:

$ bind 'TAB:menu-complete' 

сейчас, для остальной части этой сессии, при нажатии Tab вы получите полное имя файла, а не только префикса (нажмите Tab снова перебрать матчей). Это позволит вам удобно выбрать файл с одним нажатием клавиши.

+0

Хороший взлом! Имеет дополнительный бонус подстановочного соответствия, если вы хотите получить конкретное расширение. – Aprel

0

Время от времени я с помощью shuf:

find -name '*whatever*' | shuf | head -n 1 

shuf является инструментом, часть GNU Coreutils, который печатает входные строки в случайном порядке. Иными словами, это shuf fles линии.

Смежные вопросы