Цикл в текстовых файлах сценарий оболочки

Можно использовать vmtouch для добавления файлов к кэшу страницы (дисковый кэш).

Поместить nohup vmtouch -dl & в Вашем /etc/rc.local файл, чтобы добавить и заблокировать файлы в Ваш кэш страницы на начальной загрузке. Если Вы хотите добавить файлы к своему кэшу страницы, но не хотите блокировать их в память, используйте -t флаг вместо -ld флаги.

Для получения дополнительной информации о кэше страницы посмотрите здесь, здесь, и на Википедию.

5
24.06.2015, 17:17
6 ответов

Используя , найдите :

#!/bin/bash
path="/home/userA/folder"
find "$path" -maxdepth 1 -type f -name "*.txt" -print0 | while read -d $'\0' file; do
    a="$path/$(basename $file)/a_%06.jpg"
    echo "$a
done
2
27.01.2020, 20:35

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

#!/bin/bash
for i in /home/userA/folder/*.txt
do
    ## Get the file name
    str1="${i##*/}"

    ## Get the target directory
    dir="/home/userA/folder2/${str1%.txt}/"
done

Это использование встроенных в оболочку функций обработки строк . $ {var ## pattern} удаляет самое длинное совпадение шаблона с начала $ var и $ {var% pattern} удаляет самое короткое совпадение шаблона с конца $ var . Итак, $ {i ## * /} удаляет все до последнего / (путь) из имени файла и $ {i% .txt} удаляет строку .txt с ее конца.

3
27.01.2020, 20:35

Если вы действительно хотите поместить его в переменную, вы можете использовать массив bash:

#!/bin/bash
FILES=(/home/userA/folder/*.txt)
for i in "${FILES[@]}" # double qouting pervents extra word splitting
do
    bn="$(basename "$i")" # to get the name of the file
    a="/home/userA/folder2/$bn/a_%06d.jpg"
done

Или вы можете просто использовать для i в / home / userA / folder /*.txt .

0
27.01.2020, 20:35

Вы имеете в виду это?

 ~/test $ for i in F/*.txt; do n="TARGET/$(basename "$i" .txt)"; echo "$n"; done
TARGET/a
TARGET/b
TARGET/c
 ~/test $ ls F
a.txt  b.txt  c.txt
 ~/test $

И со специальными символами и пробелами:

 ~/test $ for i in F/*.txt; do n="TARGET/$(basename "$i" .txt)"; echo "\"$n\""; done
"TARGET/a b€C\""
"TARGET/a"
"TARGET/b"
"TARGET/c"
 ~/test $ ls F
a b€C\".txt  a.txt  b.txt  c.txt
2
27.01.2020, 20:35
find /home/userA/folder/ -maxdepth 1 -type f -name "*.txt" -print0 | while read -r -d '' file; do filename=$(printf "%s\n" "$file" | awk -F'/' '{gsub(".txt","");print $5}' ); printf "/home/userA/folder2/%s" "$filename"; done
0
27.01.2020, 20:35

Просто забудьте о echo и обратных кавычках и номере поля на этой строке

    str1=`echo $i | cut -d'/' -f5 `#to get the name of the file

Но basename, возможно, будет лучше.

    str1=`basename $i` #name of the file

Подобно этому

#!/bin/bash
FILES=/home/userA/folder/*.txt
for i in $FILES
do
    str1=`basename "$i"` #to get the name of the file
    echo $str1
    ls -l "`dirname "$i"`/$str1"
done

Для получения хорошего ответа о работе с циклами и файлами с пробелами в их имени обратитесь к Этот ответ

2
27.01.2020, 20:35

Теги

Похожие вопросы