Если я правильно понимаю, вы хотите взять первые символы каждого имени файла до первого небуквенного имени и сопоставить их с первыми символами целевой каталог до первого _
. Предполагая, что каждый такой шаблон соответствует только один раз, вы можете сделать:
for file in /var/backup/*; do
fname=${file##*/};
fname=${fname/.*/};
cp -v "$file" /path/"$fname"*/;
done
Результат:
$ ls /path/*
/path/adbs_32:
adbs.spec
/path/dmsx_ty_32:
dmsx.spec
/path/fomru_ts_td-45:
fomru32.spec
/path/gend_monitor:
gend.spec
Вывод точно такой же, как если бы вы попытались перечислить каталог, в котором биты разрешения x
отсутствуют.
Вот пример того, как воспроизвести ситуацию:
$ cd /tmp
$ mkdir dirperms
$ cd dirperms
$ touch foo bar baz
$ mkdir zot
$ cd..
$ chmod a-x dirperms
$ cd dirperms
bash: cd: dirperms: Permission denied
$ ls -l dirperms
ls: cannot access 'dirperms/baz': Permission denied
ls: cannot access 'dirperms/bar': Permission denied
ls: cannot access 'dirperms/foo': Permission denied
ls: cannot access 'dirperms/zot': Permission denied
total 0
-????????? ? ? ? ? ? bar
-????????? ? ? ? ? ? baz
-????????? ? ? ? ? ? foo
d????????? ? ? ? ? ? zot/
Таким образом, использование testdisk
, вероятно, было излишним; вы могли бы просто исправить права доступа к каталогу Screenshots
с помощью chmod -R u+X Screenshots
.
Основная причина ошибочных разрешений может заключаться в том, что исходная файловая система, возможно, была файловой системой, которая не поддерживала разрешения в стиле Unix -, поэтому разрешения, сообщаемые драйвером файловой системы (для совместимости с POSIX )не соответствует реальности того, к чему драйвер фактически разрешил rsync
доступ. Поэтому rsync
реплицировал поддельные разрешения в целевую файловую систему, где они фактически использовались как настоящие настройки разрешений, что и вызвало проблему.