Предположительно файл .bash_history
начинается с нетекстовых данных, поэтому grep
обрабатывает файл как двоичный. Это подтверждается выводом файла .bash_history
:
.bash_history: data
Вы можете прочитать несколько байтов с самого начала, чтобы получить соответствующее представление:
head -c1K .bash_history
Здесь я читаю первый 1 КиБ.
STDOUT можно направить в шестнадцатеричный дамп
/ od
или аналогичный.
Кстати, grep
принимает в качестве аргумента имена файлов, поэтому cat
здесь бесполезны; попробуйте следующее:
grep git .bash_history
как я могу изменить каталог, просто передав ../ команде cp
Вы не можете передать аргумент "изменить каталог" (сравнимый с опцией -C
в tar
, например) ни в одной версии cp
, которую я когда-либо видел. Ранее я предлагал просто выполнить cd
в сценарии оболочки, прежде чем выдать команду cp
, но это тоже было сочтено бесполезным.
Вот мои предположения:
Структура файлов на прежнем месте:
..
├── app
│ ├── code
│ ├── design
│ ├── etc
│ └── locale
│ └── ...
├── script.d
│ ├── file.list
│ ├── script.sh
└── skin
└── frontend
└── ...
file.list - имя файла, содержащего список файлов для копирования. script.sh - это следующий скрипт.
#! /bin/bash
distDir="THE NEW DIRECTORY PATH" # <<<<<< Alter this line
for filePath in $(cat "file.list");
do
len=$(wc -c "$filePath")
newFilePath=$(cut -c4-$len "$filePath")
tempFileName=$(grep -Po '[^/]+$' "$filePath")
path=$(grep -Po '^.*/' "$newFilePath")
newPath=$distDir
for dir in $(echo "$path" | tr / '\n');
do
if [ $(ls "$newPath" | grep -P '^'$dir'$' | wc -l) = 0 ]
then
mkdir "$newPath"'/'"$dir"
newPath="$newPath"'/'"$dir"
fi
done
cp "$filePath" "$newPath"'/'
done
Убедитесь, что вы указали правильный путь в первой строке.