ошибка ввода / вывода при копировании или связывании файла, содержащего escape-символы, из домашнего каталога в систему nfs

Предположим, что у меня есть домашний каталог /home/mydir (нет разрешения sudo), в котором есть файл, содержащий формат времени (ГГГГ-ММ-ДД_ЧЧ: ММ: СС) в имени файла, когда я пытаюсь скопировать или связать эти файлы в каталог nfs он сообщит об ошибке, что-то вроде

cp: cannot stat './2013010206/NARR_3D:2013-01-03_00': Input/output error
cp: cannot stat './2013010206/NARR_3D:2013-01-03_03': Input/output error
cp: cannot stat './2013010206/NARR_3D:2013-01-03_06': Input/output error
cp: cannot stat './2013010206/met_em.d01.2013-01-02_06:00:00.nc': Input/output error
cp: cannot stat './2013010206/met_em.d01.2013-01-02_09:00:00.nc': Input/output error
cp: cannot stat './2013010206/met_em.d01.2013-01-02_12:00:00.nc': Input/output error
cp: cannot stat './2013010206/met_em.d01.2013-01-02_15:00:00.nc': Input/output error

или

$ cp ~/tests/2013010206/met_em.d03.2013-01-02_12\:00\:00.nc .
cp: cannot stat './met_em.d03.2013-01-02_12:00:00.nc': Input/output error

Я думаю, что это связано с обратной косой чертой escape-символов \ в формате времени (12\:00\:00) или произнесите \: для всего файла, поскольку, когда я использую эту команду

$ cp ~/tests/2013010206/met_em.d03.2013-01-02_12\:00\:00.nc met_em_2013-01-02_12
$ ls
met_em_2013-01-02_12

Это нормально. Так что проблема в том, как с этим справиться, если некоторые настройки в NFS можно изменить, потому что этот тип файла формата времени необходим для большинства моих исполняемых файлов.

И следующая настройка в /etc/fstab

IP:/share1   /share1     nfs     rw,sync,nosuid,rsize=65536,wsize=65536    0 0
0
задан 25 May 2019 в 10:33

1 ответ

Редактировать : @AllenZhang: Я полностью неправильно понял ваш вопрос, прочитав все nfs в тексте вашего вопроса как NTFS . Однако проблема может все еще быть связана с NTFS в случае, если ваш nfs сервер является машиной Windows.


Некоторые символы (включая " * / : < > ? \ |) не допускаются в именах файлов в разделе NTFS. См. Википедия Имя файла в теме . Ваша проблема связана с символом : (двоеточие). При копировании вы должны заменить его другим символом.


В качестве демонстрации рассмотрим следующие команды, запущенные на томе NTFS :

$ touch met_em.d03.2013-01-02_12:00:00.nc 
touch: setting times of 'met_em.d03.2013-01-02_12:00:00.nc': No such file or directory
$ ls met_em.d03.2013-01-02_12:00:00.nc 
ls: cannot access 'met_em.d03.2013-01-02_12:00:00.nc': No such file or directory
$ df .
Filesystem     1K-blocks      Used Available Use% Mounted on
/dev/sdc1      312568640 264057464  48511176  85% /media/my_user/WD_300GB
$ blkid /dev/sdc1
/dev/sdc1: LABEL="WD_300GB" UUID="2E584CDC584CA505" TYPE="ntfs" PARTUUID="0015bef7-01"
$ sudo file -sL /dev/sdc1
/dev/sdc1: DOS/MBR boot sector, code offset 0x52+2, OEM-ID "NTFS    ", sectors/cluster 8, Media descriptor 0xf8, sectors/track 63, heads 255, hidden sectors 63, dos < 4.0 BootSector (0x80), FAT (1Y bit by descriptor); NTFS, sectors/track 63, sectors 625137281, $MFT start cluster 786432, $MFTMirror start cluster 39071080, bytes/RecordSegment 2^(-1*246), clusters/index block 1, serial number 02e584cdc584ca505; containsMicrosoft Windows XP/VISTA bootloader NTLDR

Сравните его с командами, запущенными на ext4 Том:

$ cd
$ touch met_em.d03.2013-01-02_12:00:00.nc
$ ls  met_em.d03.2013-01-02_12:00:00.nc
met_em.d03.2013-01-02_12:00:00.nc
$ df .
Filesystem     1K-blocks      Used Available Use% Mounted on
/dev/sda       479670976 130386736 324848528  29% /home
$ blkid /dev/sda
/dev/sda: LABEL="home filesystem" UUID="91ee80e9-39bc-4521-bd48-46136744435b" TYPE="ext4"
$ sudo file -sL /dev/sda
/dev/sda: Linux rev 1.0 ext4 filesystem data, UUID=91ee80e9-39bc-4521-bd48-46136744435b, volume name "home filesystem" (needs journal recovery) (extents) (64bit) (large files) (huge files)

Возвращаясь к нашему NTFS Том:

$ touch $(echo met_em.d03.2013-01-02_12:00:00.nc | tr ':' '-')
$ ls
met_em.d03.2013-01-02_12-00-00.nc

Итак, если вы хотите скопировать некоторые файлы из каталога в свой NTFS (или nfs ), вы можете использовать этот скрипт, который заменит все двоеточия (:) символами подчеркивания (_), при копировании [ 1136]:

#!/bin/bash
destination=./your_nfs_directory
for fn in "$@" ; do
  newfn=$(basename "$fn")
  cp -iv "$fn" "${destination}/${newfn//:/_}"
done

Не забудьте заменить каталог real destination nfs в строке, начинающейся с destination=. Сценарий может быть использован, как в следующем примере:

./script_name ./2013*/*2013-01*

Если имена ваших файлов содержат другие недопустимые символы, вы должны обновить его, чтобы позаботиться и о них.


Примечание: Я перемонтировал том NTFS вручную. Я предполагаю, что это пропускает некоторые специальные параметры монтирования для совместимости с Windows. На этот раз я смог создать файл с : в нем:

$ cd
$ sudo umount /dev/sdc1
$ mkdir /tmp/mountpoint
$ sudo mount /dev/sdc1 /tmp/mountpoint
$ cd /tmp/mountpoint
$ touch met_em.d03.2013-01-02_12:00:00.nc 
$ ls
met_em.d03.2013-01-02_12:00:00.nc
0
ответ дан 25 May 2019 в 10:33

Другие вопросы по тегам:

Похожие вопросы: