假设我有一个主目录/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