众所周知,在Linux系统中遍历查找文件可以使用 find
指令。我们这里来一点高级的干货 (bushi):
find ./ -type f -print0 -exec | xargs -0 grep "hello world"
上述指令将会在当前文件夹中遍历查找所有文件,并找出哪一个文件中包含 hello world
字样。
近日由于频繁需要在开发项目中使用 CMD
, 所以每次都需要 Win + R
键呼出 CMD
,非常的麻烦。
于是乎搜索了一番,发现可以使用注册表解决这个问题,我们一起来看具体步骤:
Win + R
键呼出运行, 然后输入 regedit
打开注册表。HKEY_CLASSES_ROOT
栏, 然后找到你想添加的位置。例如文件夹目录下, 则为 Directory
。shelll
并右键, 然后点击 新建 (N)
->项 (K)
, 输入自定义的名称。(默认)
里输入右键时需要显示的提示, 这里例如 在此处打开CMD命令提示符
。字符串值
并命名为 Icon
, 然后输入Icon的资源地址 (这里例如 C:\Windows\System32\cmd.exe
)。创建子项
, 并命名为 command
。command
中的 (默认)
位置输入单击此选项时需要执行的命令, 这里为 cmd.exe
。PS: 若需要在空白处显示, 对应的项不是 Directory, 而是其目录下的 Background
。
桌面空白处:计算机\HKEY_CLASSES_ROOT\DesktopBackground\Shell
文件:计算机\HKEY_CLASSES_ROOT*\shell
文件夹:计算机\HKEY_CLASSES_ROOT\Directory\shell
文件和文件夹:计算机\HKEY_CLASSES_ROOT\AllFilesystemObjects\shell
文件夹空白处:计算机\HKEY_CLASSES_ROOT\Directory\Background\shell
本文参考 这里 学习到的, 欢迎阅读原文。
最近刚开始学习Vue,由于没有使用vue-cli脚手架,并且本地的编译环境并非Nginx设定的web目录,所以尝试使用 npm run build
之后每次都需要手动将编译好的 dist
目录移动到Nginx设定的web目录下,非常的麻烦。(也许有更方便的办法,但耐于我是初学者一时半会不知道如何正确配置,所以使用了如下的脚本)
然后我便有了之前的以下代码:
@echo off
chcp 65001
set ORIGINAL_PATH=%cd%
cd ../..
set VUE_BUILT_PATH=%cd%
set TARGET_DEL_DIR=vuetest
set CURRENT_PATH=%VUE_BUILT_PATH%\%TARGET_DEL_DIR%
set input=N
if exist %CURRENT_PATH% (
set /p input="本文件夹下的所有文件将被删除!此操作不可逆![Y/N] "
if %input% == Y (
echo 路径: %CURRENT_PATH% [已确认删除!]
rd/s/q %CURRENT_PATH%
) else (
echo 已取消.
)
)
cd %ORIGINAL_PATH%
pause
结果后来经过非常之久的脚本执行,发现 set
的值 input
始终无法将参数传递到 if
语句里面,百度了半天也不知道是什么原因。
后来我突然意识到,会不会跟JavaScript一样变量都有作用域?然后我又尝试将 set input=N
移动到了 if
语句里面,结果还是不行。后来我干脆直接删除了 if
语句的判断,发现可以了。
直到那时候我才意识到可能是CMD的 "BUG"
或者 "特性"
导致的吧。
于是改进了代码之后有了如下的最终脚本:
@echo off
chcp 65001
TITLE 编译文件移动脚本
set ORIGINAL_PATH=%cd%
cd ../..
set VUE_BUILT_PATH=%cd%
set TARGET_DEL_DIR=vuetest
set CURRENT_PATH=%VUE_BUILT_PATH%\%TARGET_DEL_DIR%
set input=N
if not exist %CURRENT_PATH% (
echo 正在移动编译文件夹...
move %ORIGINAL_PATH%\dist %CURRENT_PATH%
pause
exit
)
set /p input="本文件夹下的所有文件将被删除!此操作不可逆![Y/N] "
if %input% == Y (
echo 路径: %CURRENT_PATH% [已确认删除!]
rd/s/q %CURRENT_PATH%
) else (
echo 已取消.
)
cd %ORIGINAL_PATH%
pause
真的不知道是什么奇葩的问题导致的,好在最后解决了:)
二者如何取舍
非线程安全是指多线程操作同一个对象可能会出现问题。而线程安全则是多线程操作同一个对象不会有问题。
线程安全必须要使用很多synchronized关键字来同步控制,所以必然会导致性能的降低。
所以在使用的时候,如果是多个线程操作同一个对象,那么使用线程安全的Vector;否则,就使用效率更高的ArrayList。
非线程安全!=不安全
有人在使用过程中有一个不正确的观点:我的程序是多线程的,不能使用ArrayList要使用Vector,这样才安全。
非线程安全并不是多线程环境下就不能使用。注意我上面有说到:多线程操作同一个对象。注意是同一个对象。比如最上面那个模拟,就是在主线程中new的一个ArrayList然后多个线程操作同一个ArrayList对象。
如果是每个线程中new一个ArrayList,而这个ArrayList只在这一个线程中使用,那么肯定是没问题的。
线程安全的实现
线程安全是通过线程同步控制来实现的,也就是synchronized关键字。