Можно использовать vmtouch для добавления файлов к кэшу страницы (дисковый кэш).
Поместить nohup vmtouch -dl
в Вашем /etc/rc.local
файл, чтобы добавить и заблокировать файлы в Ваш кэш страницы на начальной загрузке. Если Вы хотите добавить файлы к своему кэшу страницы, но не хотите блокировать их в память, используйте -t
флаг вместо -ld
флаги.
Для получения дополнительной информации о кэше страницы посмотрите здесь, здесь, и на Википедию.
Используя , найдите
:
#!/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
Если все, что вам нужно, - это получить имя файла и использовать его для получения правильного целевого каталога, вы можете сделать:
#!/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
с ее конца.
Если вы действительно хотите поместить его в переменную, вы можете использовать массив 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
.
Вы имеете в виду это?
~/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
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
Просто забудьте о 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
Для получения хорошего ответа о работе с циклами и файлами с пробелами в их имени обратитесь к Этот ответ