
Привет, я сейчас пытаюсь выполнить следующий код. Я сохранил строку внутри переменной DATE в формате YYYY/MM/DD. Я пытаюсь извлечь год с помощью команды cut. Я получаю сообщение об ошибке, в котором говорится, что это не файл или каталог. Есть ли какие-то изменения, которые я могу сделать, или другой способ сделать это?
for file in ~/filesToSort/*
do
DATE=$(head -1 $file | tr "-" "/")
echo "${DATE}"
YYYY=$(cut -c1-4 accounts $DATE)
#echo "${YYYY}"
done
Спасибо
решение1
Утилита cut
считывает данные из стандартного входного потока, она не работает со строками, указанными в качестве аргументов.
Таким образом, для использования cut
вам необходимо передать данные на стандартный ввод:
YYYY=$( printf '%s\n' "$DATE" | cut -d '/' -f 1 )
Однако это было бы очень медленно в цикле. Вместо этого используйте встроенную замену параметров, чтобы удалить все после первого /
в $DATE
строке:
YYYY=${DATE%%/*}
Это удаляет самую длинную строку суффикса из $DATE
, которая соответствует шаблону оболочки /*
. Если строка 2021/10/21
, то это возвращает 2021
.
Чтобы получить первые четыре символа каждого файла в каталоге (в этом и заключается суть того, что яполагатьваш текущий код пытается сделать), вы можете использовать sed
вот так:
for name in "$HOME"/filesToSort/*; do
sed -e 's/\(....\).*/\1/' -e q "$name"
done
Он считывает первую строку каждого файла, заменяет содержимое строки первыми четырьмя символами строки, а затем завершает работу после вывода результата на терминал.
решение2
Если ваша оболочка поддерживает это, вы можете использовать <<<
для этого Here Strings ( ). Из man bash
:
Here Strings
A variant of here documents, the format is:
[n]<<<word
The word undergoes tilde expansion, parameter and variable expansion,
command substitution, arithmetic expansion, and quote removal. Path‐
name expansion and word splitting are not performed. The result is
supplied as a single string, with a newline appended, to the command
on its standard input (or file descriptor n if n is specified).
В вашем случае вы бы сделали следующее:
for file in ~/filesToSort/*
do
date=$(head -1 "$file" | tr "-" "/")
echo "${DATE}"
yyy=$(cut -c1-4 <<< "$date")
echo "$yyy"
done
решение3
Еще один способ использования старого доброгоawk
for file in *; do
awk -F'-' 'NR==1 {print $1}' $file
done
-F '-'
сообщает awk, что нужно использовать-
в качестве разделителяNR==1
указать awk читать только первую строку каждого файла{print $1}
печатать только первое поле, разделенное разделителем