Как напечатать только имя файла при циклическом просмотре всех файлов каталога - PullRequest
0 голосов
/ 22 апреля 2020

Представьте, что в моем каталоге есть 3 подкаталога:

dfcg7 yhjs6 gbggse3

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

Я пытаюсь:

for file in /mnt/lustre/mydir*
do
        printf "$file/*.txt \t"
done

, и я также попытался:

for file in /mnt/lustre/mydir*
do
        printf "$file"/*.txt "\t"
done

, но в обоих случаях мой вывод это:

/mnt/lustre/mydir/dfcg7/*txt/mnt/lustre/mydir/yhjs6/*txt/mnt/lustre/mydir/gbggse3/*txt
  1. Мой вывод не разделен табуляцией
  2. Он печатает полный путь вместо относительного
  3. Он не печатает имя файла внутри каждого подкаталога

Итак, мой желаемый вывод будет таким:

dfcg7/fileA.txt    yhjs6/fileB.txt    gbggse3/fileC.txt

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

Ответы [ 4 ]

2 голосов
/ 22 апреля 2020

Вы можете сохранить префикс пути в переменной:

prefix=/mnt/lustre/mydir

Назначить файлы массиву:

files=("$prefix"/*/*.txt)

И затем распечатать массив, разделив табуляцией, удаляя префикс от каждого элемента:

$ (IFS=$'\t'; printf '%s\n' "${files[*]/#"$prefix"\/}")
dfcg7/fileA.txt gbggse3/fileC.txt       yhjs6/fileB.txt

Используется подоболочка для хранения области видимости измененного IFS.

0 голосов
/ 22 апреля 2020

Можно попробовать.

for file in /mnt/lustre/mydir/*/*.txt; do
  printf '%s\t%s\t%s' "${file#*/*/*/*/}"
done

Вывод

dfcg7/fileA.txt         gbggse3/fileC.txt               yhjs6/fileB.txt
0 голосов
/ 22 апреля 2020

Попробуйте:

cd /mnt/lustre/mydir
for file in */*.txt
do
        printf "%s\t" "$file"
done
printf "\n"

Или проще:

(cd /mnt/lustre/mydir; ls -d */*.txt | tr '\n' '\t'); echo

Последним echo является добавление \n в конце, но если вам это не нужно Вы можете оставить это.

0 голосов
/ 22 апреля 2020

Это быстрое решение, которое мне удалось найти

RESULT=""
for file in /path/to/you/files/*; do
    OUTPUT=$(ls $file/*txt)
    RESULT="$RESULT:$OUTPUT"
done
# replace every : with a tab symbol and remove the first tab
echo $RESULT | tr ':' '\t' | gsed -r 's/^\s+//g'

Обратите внимание, что я использовал gsed здесь. Это GNU sed, доступный для MacOS. Если вы используете Linux, вы можете просто использовать sed.

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