相关疑难解决方法(0)

linux find命令没有扩展名的文件名未知扩展名

我喜欢使用以下命令来打印文件名,但它会打印带有扩展名的文件名。

find . -type f -printf '%f\n'
Run Code Online (Sandbox Code Playgroud)

在我的目录中,有许多具有不同扩展名的文件。我尝试--ignore='*.*'在 before 和 after 中添加-printf,但没有用。例子; 我有文件 myfile1.txt、myfile2.mp3 等。我需要它打印 myfile1、myfile2 等。我该怎么做?

find filenames

6
推荐指数
1
解决办法
6255
查看次数

将大量文件移动到日期结构化目录顺序中

我在这个目录中有大约 100 万个文件: /home/username/images/

每个文件的名称类似于:012345678910(Place)_0_20120414185957_28841.jpg文件名的时间戳部分在每张图片上都发生了变化。

下面的代码包含将文件排序/移动到此日期结构中的代码: /home/username/sorted/2012/04/14/18/name_of_file.jpg

对于一小部分文件它工作正常,但对于巨大的目录,我的腻子终端在输出后断开连接

Directory $newdir does not exist.  Creating same.
Run Code Online (Sandbox Code Playgroud)

我有其他代码总是随着错误代码而死亡argument list too long。

这是代码:

#!/bin/bash
ALLFILES=(images/*)
for ((i=0; i<${#ALLFILES[*]}; i+=30000));
do
    set $(echo "${ALLFILES[@]:i:30000}" | awk -F_ '{print $1, $2, $3, $4, $5}')
    fullyear=$3
    year=$(echo $fullyear |cut -c1-4)
    month=$(echo $fullyear |cut -c5-6)
    day=$(echo $fullyear |cut -c7-8)
    hour=$(echo $fullyear |cut -c9-10)
    newdir=$(echo /home/username/sorted/$year/$month/$day/$hour/)
    if ! [ -d $newdir ]; then
        echo Directory $newdir does not exist.  Creating same.
        mkdir -p $newdir; …
Run Code Online (Sandbox Code Playgroud)

shell-script rename files

5
推荐指数
1
解决办法
2万
查看次数

读取时读取里面的键盘按键

我有一个脚本可以搜索一些文件,其中一些带有空格,因此我正在使用while read. 在这样的循环内部,我需要使用 read -p "Pause" 来等待每次交互的按键。然而,它不是等待按键,而是读取管道的第一个字母。我需要这样的东西:

find . -name "*.o3g" | grep "pattern" | while read line
do
    process "$line"
    read -p "Press any key to continue"
done
Run Code Online (Sandbox Code Playgroud)

bash shell-script

5
推荐指数
1
解决办法
2346
查看次数

导出在此代码中是否有任何用途?

在TLDP的Analyzing Scripts网页中,提供如下代码进行分析:

export SUM=0
for f in $(find src -name "*.java"); do
    export SUM=$(($SUM + $(wc -l $f | awk '{ print $1 }')))
done
echo $SUM
Run Code Online (Sandbox Code Playgroud)

我知道它计算目录中所有 *.java 文件的行数总和src。我不明白的是使用export关键字的原因,其描述如下:

export 命令为正在运行的脚本或 shell 的所有子进程提供变量。

由于SUM子进程从未访问过,是否有任何理由导出它?

shell-script

5
推荐指数
1
解决办法
853
查看次数

由 find ... -exec grep ... {} \+ 的结果给出的可靠打开文件的方法

我经常运行这样的命令:

find … -exec grep … --color=always -l {} \+
Run Code Online (Sandbox Code Playgroud)

有时我需要在 Vim 中打开匹配的文件。

但最可靠的方法是什么?

一种方法似乎是

vim $(find … -exec grep … {} \+)
Run Code Online (Sandbox Code Playgroud)

另一种方法似乎是利用xargs.

这两种方法和其他方法(如果有的话)是否有优点/缺点/问题需要注意?

grep vim find xargs

5
推荐指数
2
解决办法
519
查看次数

如何查找没有后缀版本的文件?

我有几百万个.jpg文件,我想.jpg.webp为每个文件生成一个版本 ( foo.jpg-> foo.jpg.webp)。为此,我需要找到所有.jpg以 There\xe2\x80\x99s 结尾的文件,没有.jpg.webp版本。

\n

现在,我这样做:

\n
find "$path" -type f -iname "*.jpg" |\n  while read -r image_path; do\n      if [ ! -f "$image_path.webp" ]; then\n        echo "$image_path"\n      fi\n  done |\n  # treat only 10000 files per run\n  head -n 10000 |\n  ...\n
Run Code Online (Sandbox Code Playgroud)\n

但是,因为 I\xe2\x80\x99m 使用管道,所以这会创建一个子 shell。我想知道是否有更有效的方法来做到这一点,特别是因为我生成的 WebP 图像越多,脚本花费在过滤路径来查找候选者上的时间就越多。是否有某种方法可以find仅使用来做到这一点?

\n

I\xe2\x80\x99m 使用 Ubuntu 20.04。文件分布在子目录中。

\n

bash find files

5
推荐指数
3
解决办法
1035
查看次数

如何在目录树的最深层命名文件

如何使用基本的 Bash 命令和脚本在目录树的最深层命名一个随机文件?

我正在寻找一种方法,将其作为单行且没有函数来完成。还假设我从当前目录开始,然后朝着深度工作。

find,grep,sed和awk是可接受的命令。

我目前的尝试看起来像这样并且不起作用:

查找类型 d | 声明 COUNT=-1; 声明 P=""; 在阅读 LINE 时;做回声 $LINE; 声明C;C=$(echo $LINE | cut -c3- | sed "s/\//\n\//g" | grep '/' -c); 回声 $C; 如果 [ $COUNT -gt $C ]; 然后让 COUNT=$C; 让 P=$LINE; echo "完成"; fi; 完毕

这只会找到目录。

如何以最简单的方式解决这个问题?

bash

4
推荐指数
1
解决办法
5163
查看次数

具有先前查找结果的 Unix Tar 命令

假设我们有 4 个文件:

a.zip created on 28 feb 2018
b.zip created on 28 feb 2018
c.zip created on 2 mar 2018
d.zip created on 2 mar 2018
Run Code Online (Sandbox Code Playgroud)

我想搜索 28 Feb 的文件并将其压缩。

find ./ -type f -ls | grep 'Feb 28' | tar -czf somefile3.tar --null -T -
Run Code Online (Sandbox Code Playgroud)

但它不起作用。

linux tar find

4
推荐指数
1
解决办法
1548
查看次数

将包含字符串的文件合并为一个文档

基于此脚本:

find . -name "*.txt" | grep 'LINUX/UNIX'
Run Code Online (Sandbox Code Playgroud)

和

find . -name "*.txt" | grep 'LINUX/UNIX' | xargs cp <to a path>
Run Code Online (Sandbox Code Playgroud)

从这里 ,我可以 grep 某个字符串的文件,然后将这些文件复制到一个目录中,如果它们包含该字符串,但它们会被保存为单独的文件。如何将这些文件归类为一个连贯的文档?

示例 我的想法如下:我有一个引用档案,分布在数百个文件夹中的单独文件中,文件夹的名称是各自的主题。所以“哲学/本体论/概念/aletheia/notes.tex”将包含我所有关于aletheia等哲学概念的笔记。

它们都遵循一些命名约定(名称始终为:notes.tex),因此对它们进行 grep 很容易。我可以通过 grep 搜索它们,但我希望能够有一个脚本,它不仅可以找到它们,还可以将包含相应字符串的所有文件连接到一个大文件中。

shell grep

4
推荐指数
1
解决办法
93
查看次数

如何按列对齐shell“for”循环中生成的输出

我正在尝试对齐 bashfor循环的输出。

目前,我从循环中得到如下输出:

Directory:  /some/long/directory/path  Remote:  some-remote
Directory:  /some/dir/path  Remote:  other-remote
Run Code Online (Sandbox Code Playgroud)

我试图这样对齐:

Directory:  /some/long/directory/path  Remote:  some-remote
Directory:  /some/dir/path             Remote:  other-remote
Run Code Online (Sandbox Code Playgroud)

生成此输出的当前基本循环如下所示:

Directory:  /some/long/directory/path  Remote:  some-remote
Directory:  /some/dir/path  Remote:  other-remote
Run Code Online (Sandbox Code Playgroud)

我试过使用:

  • column (分别格式化每一行,因为它是一个 for 循环)
  • printf ( printf "Directory: %s Remote: %s\n" "$dir" "$remote")
  • awk( echo "Directory: $dir Remote: $remote" | awk '{printf ("%s-20s %s-20s %s-20s %s-20s",$1 $2 $3 $4)}')

在这些命令的许多其他变体中。

我可能缺少一些基本的东西(我尽力在网上查看其他示例并阅读man页面),但我无法让它工作。

我真的很感激任何关于我做错了什么的指示。

bash text-processing printf

4
推荐指数
2
解决办法
177
查看次数

标签 统计

bash ×4

find ×4

shell-script ×3

files ×2

grep ×2

filenames ×1

linux ×1

printf ×1

rename ×1

shell ×1

tar ×1

text-processing ×1

vim ×1

xargs ×1