将包含转义字符的文件从主目录复制或链接到 nfs 系统时出现输入/输出错误

将包含转义字符的文件从主目录复制或链接到 nfs 系统时出现输入/输出错误

假设我有一个主目录/home/mydir(没有 sudo 权限),其中有一些文件的文件名包含时间格式(YYYY-MM-DD_HH:MM:SS),当我尝试将这些文件复制或链接到 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

\我认为这与时间格式中的转义字符反斜杠有关( 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 里面有些设置是可以修改的,因为我的很多运行中的 exe 都需要这种时间格式的文件。

以下是设置/etc/fstab

IP:/share1   /share1     nfs     rw,sync,nosuid,rsize=65536,wsize=65536    0 0

答案1

编辑: @AllenZhang : 我完全误解了你的问题,因为我读了所有内容网络文件系统在你的问题文本中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(或者网络文件系统) 卷,您可以使用此脚本,它将所有冒号 ( ) 替换:为下划线 ( _) 字符,复制时

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

不要忘记更换你的真实的目的地网络文件系统目录中以 开头的行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

相关内容