Linux常用命令——批量复制与重命名
一、将val文件夹下的所有png图片复制到train文件夹下的同级目录下,因val和train中存在相同名字的图片,因此复制过去的同时为避免冲突需要对文件重命名,终端运行以下命令:
for F in val/*/*.png; do tmp=${F#val/}; cp -vf ${F} "train/"${tmp%.png}"_1.png"; done
for F in val/*/*.png
遍历val及其子文件夹下的png文件,如val/0/0001.png
tmp=${F#val/}
去掉字符串从左往右直到出现val/的地方(含val/),如0/0001.png
,并赋值给变量tmp${tmp%.png}
去掉字符串从右往左直到出现.png的地方(含.png),如0/0001cp -vf ${F} "train/"${tmp%.png}"_1.png"
如cp -vf val/0/0001.png train/0/0001_1.png
二、保留最近的1个文件,全部删除其余的文件:
rm `ls -t | tail -n +2`
三、服务器上运行tensorboard,在本地查看:
本地终端运行
ssh -L 16006:127.0.0.1:6006 username@server_ip -N -v -v
服务器上运行tensorboard:
tensorboard --logdir /your/log/dir --port 6006
本地浏览器浏览:http://localhost:16006/
四、linux硬盘挂载。一般移动硬盘在买回来之后,我们对其进行格式化,同时修改其名字为个性化名字。在linux系统上插入移动硬盘后,如何查看其名字并挂载呢?
查看名字(label):
ls -l /dev/disk/by-label
以ZJRR4为例,将其挂载到/media/user-name/ZJRR4下。
sudo mkdir /media/user-name/ZJRR4
sudo umount /dev/sdc1
sudo mount /dev/sdc1 /media/user-name/ZJRR4
五、拷贝文件夹下满足某一条件的文件到另一个文件夹,保持目录结构。如拷贝src下及其子文件下的所有jpg格式的图像到dst下,并保持目录结构:
- cd到src文件夹下
- 在dst下创建相同的目录结构:
find . -type d -exec mkdir -p /dst/{} \;
- 拷贝。
find . -type f -name "*.jpg" -exec cp {} /dst/{} \;
六、Linux用多了,经常遇到奇葩的逻辑需求,比如一个文件夹下有很多图像,按照一定的规则命名,如下所示,想统计这些图像总共有哪些前缀,使用命令:ls | tr '_' ' ' | awk '{print $1}' | sort -u
将打印出现的所有前缀(不重复),如果要统计个数,命令最后再加上一个管道 wc -l
七、终于找到了一种方法,查找并删除损坏的图片。在做计算机视觉深度学习的模型训练时,大量图像copy的时候难免遇到损坏的图像却不容易察觉,结果模型训练到一半程序报错。假设要寻找并删除当前目录下损坏的图像。
- 查找所有jpg图像:
find . -type f -name "*.jpg"
- 查看图像的详细信息:
identify -verbose XXX
,如果图像损坏,会报下图所示的错误。因grep无法捕获 stderr流中的信息,需要进行重定向,将 stderr 中的信息流定向到标准输出:identify -verbose XXX 2>&1
- 正常的图片不会有
error
输出,通过管道 grep 损坏图像:grep error
- 从报错信息中提取图片名:
sed "s/.*\`\(.*\.jpg\)'.*/\1/g"
- 完整命令:
find . -type f -name "*.jpg" -exec identify -verbose {} 2>&1 \; | grep error | sed "s/.*\`\(.*\.jpg\)'.*/\1/g" | xargs rm
八、拷贝文件到服务器,排除目录中的某些文件,拷贝过去之后保留原有的目录结构,可以使用 rsync 结合 --exclude 参数,rsync -av -e ssh --exclude="*.jpg" SOURCE_DIR USER_NAME@IP:DESTINATION_DIR
但是如果要排除的文件数量非常多,如排除大量jpg图片,rsync 会非常慢。可结合 find 和 rsync 的 --files-from 参数使用。首先 cd 到 SOURCE_DIR 目录下,使用 find 生成想要拷贝的文件列表find . -type f ! -name '*.jpg' > to_copy_without_jpg.txt
,然后 cd 到上一级目录,rsync -av -e ssh --files-from=SOURCE_DIR/to_copy_without_jpg.txt SOURCE_DIR USER_NAME@IP:DESTINATION_DIR
即可