Вот безопасный способ открыть то, что file
считает текстовыми файлами в текущем каталоге в vim
. Конечно, вы можете изменить vim
на echo
, чтобы просто печатать имена.
#!/bin/bash
for f in *; do
out=$(file "$f")
[[ "${out##*: }" =~ ASCII ]] && text_files+=("$f")
done
vim "${text_files[@]}"
exit
РЕДАКТИРОВАТЬ :использовать два знака #
в расширении параметра для обработки имен файлов с :
в них.
Вы не сказали, что вы хотите делать с файлами одинакового размера. Вы также не сказали, хотите ли вы перезаписать файлы в своем «А» или ваш каталог «B».
Я не знаю, можно ли это сделать только с помощью rsync или cp. В этом примере «/tmp/A» — исходный каталог, «/tmp/B» — целевой, а «/tmp/C» — это место назначения для резервных копий.
Я делаю резервные копии и перезаписываю файлы в папке «B», которые больше. я просто перезаписываю меньшие файлы и ничего не делать с файлами того же размера.
# get the size and filnames of files in '/tmp/A' directory and loop through each file found
ls /tmp/A | while read filename
do
# get the size of file in 'A' directory
sizeA=$( ls -l "/tmp/A/${filename}" | awk '{print $5}')
# get the size of corresponding file in 'B' directory
sizeB=$(ls -l "/tmp/B/${filename}" | awk '{print $5}')
# compare file sizes and perform appropriate action
if [ ${sizeB} -gt ${sizeA} ]
then
echo "file in B named \"${filename}\" is larger than A file"
# Backup and overwrite the file
cp "/tmp/B/${filename}" /tmp/C/
cp -f "/tmp/A/${filename}" /tmp/B/
else
if [ ${sizeB} -lt ${sizeA} ]
then
echo "file in B named \"${filename}\" is smaller than A file"
# overwrite the file
cp -f "/tmp/A/${filename}" /tmp/B/
else
echo "The files \"${filename}\" are the same size"
fi
fi
done
Я провел очень ограниченный тест, и, похоже, он сработал. Пожалуйста, тщательно протестируйте и измените в соответствии с вашими потребностями.