我正在尝试shellcheck。
我有类似的东西
basename "${OPENSSL}"
Run Code Online (Sandbox Code Playgroud)
我得到以下建议
Use parameter expansion instead, such as ${var##*/}.
Run Code Online (Sandbox Code Playgroud)
从实际的角度来看,我认为没有区别
$ export OPENSSL=/opt/local/bin/openssl
$ basename ${OPENSSL}
openssl
$ echo ${OPENSSL##*/}
openssl
Run Code Online (Sandbox Code Playgroud)
由于basename在POSIX 规范中,我不知道为什么它应该是最佳实践。任何提示?
是否有任何客观理由偏爱一种形式而不是另一种形式?性能、可靠性、便携性?
filename=/some/long/path/to/a_file
parentdir_v1="${filename%/*}"
parentdir_v2="$(dirname "$filename")"
basename_v1="${filename##*/}"
basename_v2="$(basename "$filename")"
echo "$parentdir_v1"
echo "$parentdir_v2"
echo "$basename_v1"
echo "$basename_v2"
Run Code Online (Sandbox Code Playgroud)
产生:
/some/long/path/to
/some/long/path/to
a_file
a_file
Run Code Online (Sandbox Code Playgroud)
(v1 使用 shell 参数扩展,v2 使用外部二进制文件。)
我正在运行 Mac OSX 并尝试使用命令行来查找我拥有的同名文件的数量。
我尝试使用以下命令:
find ~ -type f -name "*" -print | basename | sort | uniq -d > duplicate_files
Run Code Online (Sandbox Code Playgroud)
它不起作用!当我执行以下操作时:
find ~ -type f -name "*" -print > duplicate_files
Run Code Online (Sandbox Code Playgroud)
然后duplicate_files 确实包含我所有文件的路径。所以我认为问题在于basename- 它不接受标准输入。然后我尝试了以下方法:
basename $(find ~ -type f -name "*" -print) > duplicate_files
Run Code Online (Sandbox Code Playgroud)
但这似乎不起作用。在互联网上搜索似乎并没有带来多少乐趣。任何想法最受欢迎。
如果我只使用 basename {} .txt,它会起作用:
find . -iname "*.txt" -exec basename {} .txt \;
Run Code Online (Sandbox Code Playgroud)
它只会打印 xxx 而不是 ./xxx.txt
如果我想在 -exec 选项中使用 $(basename {} .txt) ,它将失败:
find . -iname "*.txt" -exec echo "$(basename {} .txt)" \;
Run Code Online (Sandbox Code Playgroud)
它只会打印 ./xxx.txt
我怎么解决这个问题?我希望我可以$(basename {} .txt)用作其他 cmd 的参数。我必须用 xargs做sh -c或管道-exec basename {} \;吗?
我刚刚意识到我不知道如何file调用file.ext。
整体file.ext称为文件或文件名,ext称为扩展名,但您如何称呼file部分本身file.ext?
例如happy-dog.png。所有的文件/文件名都是happy-dog.png,扩展名是,png但你怎么称呼happy-dog?
这不是基名。和title一样吗?还是文件部分?有任何想法吗?
假设我有一个目录结构如下
test
test/a
test/b
Run Code Online (Sandbox Code Playgroud)
现在我想执行一个命令,这样.我就可以在文件夹中对文件的基本名称a和b.
所以基本上,我想要这样的东西,我天真地尝试过
find test -type f -exec touch `basename {}` \;
Run Code Online (Sandbox Code Playgroud)
只是,这不会导致空文件a和b父目录。假设我的 touch 命令只能接受一个参数。
这将导致这样的目录结构
a
b
test
test/a
test/b
Run Code Online (Sandbox Code Playgroud)
我知道如何在 bash 脚本中执行此操作,但我对单命令解决方案感兴趣。
示例:我想创建一个快速命令来缩小图像(对于我的文件浏览器)。
...
FN="/tmp/some-image.jpg"
gm convert "$FN" -resize 50% "$(dirname $FN)/$(basename $FN .jpg/png/gif).jpg"
...
Run Code Online (Sandbox Code Playgroud)
如何指定应删除多个后缀?
我正在使用以下命令来检索名称包含的文件数sv或json远程服务器中给定目录中的文件数:
nbs_files=`ssh -q -i ${sshkey} ${user}@${server} "find ${path}/ -maxdepth 1 -mindepth 1 -type f -name '*sv*' -o -name '*.json' -exec basename {} \; | wc -l"`
Run Code Online (Sandbox Code Playgroud)
此命令仅返回.json文件数,而sv名称中包含的文件存在于${path}.
当我删除该-o -name '*.json'部分时,该命令运行良好,并返回名称中包含“sv”的文件数。
有谁知道如何修改命令以检索sv其名称中包含的文件.json以及带有扩展名的文件?
我想将路径和文件名分配给变量:
/path/to/myfile/file.txt
Run Code Online (Sandbox Code Playgroud)
例如
MYFILE=$(pwd)$(basename)
Run Code Online (Sandbox Code Playgroud)
我该怎么做 ?
我有以下 JPEG 文件:
$ ls -l
-rw-r--r-- 1 user group 384065 janv. 21 12:10 CamScanner 01-10-2022 14.54.jpg
-rw-r--r-- 1 user group 200892 janv. 10 14:55 CamScanner 01-10-2022 14.55.jpg
-rw-r--r-- 1 user group 283821 janv. 21 12:10 CamScanner 01-10-2022 14.56.jpg
Run Code Online (Sandbox Code Playgroud)
我用来$ img2pdf将每个图像转换为 PDF 文件。要做到这一点 :
$ find . -type f -name "*.jpg" -exec img2pdf "{}" --output $(basename {} .jpg).pdf \;
Run Code Online (Sandbox Code Playgroud)
结果 :
$ ls -l *.pdf
-rw-r--r-- 1 user group 385060 janv. 21 13:06 CamScanner 01-10-2022 14.54.jpg.pdf
-rw-r--r-- 1 …Run Code Online (Sandbox Code Playgroud)